← Home
```go
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"sort"
)

type Pair struct {
	u int
	c int
}

type Edge struct {
	to  int
	rev int
	cap int
}

type Dinic struct {
	g     [][]Edge
	level []int
	it    []int
}

func NewDinic(n int) *Dinic {
	return &Dinic{
		g:     make([][]Edge, n),
		level: make([]int, n),
		it:    make([]int, n),
	}
}

func (d *Dinic) AddEdge(fr, to, cap int) {
	d.g[fr] = append(d.g[fr], Edge{to: to, rev: len(d.g[to]), cap: cap})
	d.g[to] = append(d.g[to], Edge{to: fr, rev: len(d.g[fr]) - 1, cap: 0})
}

func (d *Dinic) bfs(s, t int) bool {
	for i := range d.level {
		d.level[i] = -1
	}
	q := make([]int, len(d.g))
	head, tail := 0, 0
	d.level[s] = 0
	q[tail] = s
	tail++
	for head < tail {
		v := q[head]
		head++
		for _, e := range d.g[v] {
			if e.cap > 0 && d.level[e.to] < 0 {
				d.level[e.to] = d.level[v] + 1
				q[tail] = e.to
				tail++
			}
		}
	}
	return d.level[t] >= 0
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func (d *Dinic) dfs(v, t, f int) int {
	if v == t {
		return f
	}
	for ; d.it[v] < len(d.g[v]); d.it[v]++ {
		i := d.it[v]
		e := &d.g[v][i]
		if e.cap > 0 && d.level[e.to] == d.level[v]+1 {
			ret := d.dfs(e.to, t, min(f, e.cap))
			if ret > 0 {
				e.cap -= ret
				re := &d.g[e.to][e.rev]
				re.cap += ret
				return ret
			}
		}
	}
	return 0
}

func (d *Dinic) MaxFlow(s, t int) int {
	flow := 0
	const inf = int(1 << 30)
	for d.bfs(s, t) {
		for i := range d.it {
			d.it[i] = 0
		}
		for {
			f := d.dfs(s, t, inf)
			if f == 0 {
				break
			}
			flow += f
		}
	}
	return flow
}

func cntUpto(x, mod int) int {
	if x <= 0 {
		return 0
	}
	if mod == 0 {
		return x / 5
	}
	if x < mod {
		return 0
	}
	return (x-mod)/5 + 1
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') && data[idx] != '-' {
			idx++
		}
		sign := 1
		if data[idx] == '-' {
			sign = -1
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return sign * val
	}

	w := bufio.NewWriter(os.Stdout)
	defer w.Flush()

	n := nextInt()
	b := nextInt()
	q := nextInt()

	pairs := make([]Pair, 0, q+2)
	pairs = append(pairs, Pair{0, 0})
	for i := 0; i < q; i++ {
		u := nextInt()
		c := nextInt()
		pairs = append(pairs, Pair{u, c})
	}
	pairs = append(pairs, Pair{b, n})

	sort.Slice(pairs, func(i, j int) bool {
		if pairs[i].u == pairs[j].u {
			return pairs[i].c < pairs[j].c
		}
		return pairs[i].u < pairs[j].u
	})

	uniq := make([]Pair, 0, len(pairs))
	for _, p := range pairs {
		if len(uniq) == 0 || uniq[len(uniq)-1].u != p.u {
			uniq = append(uniq, p)
		} else if uniq[len(uniq)-1].c != p.c {
			fmt.Fprint(w, "unfair")
			return
		}
	}

	for i := 0; i+1 < len(uniq); i++ {
		diffC := uniq[i+1].c - uniq[i].c
		diffU := uniq[i+1].u - uniq[i].u
		if diffC < 0 || diffC > diffU {
			fmt.Fprint(w, "unfair")
			return
		}
	}

	m := len(uniq) - 1
	source := 0
	resStart := 1
	intStart := 6
	sink := intStart + m
	dinic := NewDinic(sink + 1)

	quota := n / 5
	for r := 0; r < 5; r++ {
		dinic.AddEdge(source, resStart+r, quota)
	}

	for i := 0; i < m; i++ {
		node := intStart + i
		need := uniq[i+1].c - uniq[i].c
		dinic.AddEdge(node, sink, need)
		L := uniq[i].u
		R := uniq[i+1].u
		for r := 0; r < 5; r++ {
			cap := cntUpto(R, r) - cntUpto(L, r)
			if cap > 0 {
				dinic.AddEdge(resStart+r, node, cap)
			}
		}
	}

	if dinic.MaxFlow(source, sink) == n {
		fmt.Fprint(w, "fair")
	} else {
		fmt.Fprint(w, "unfair")
	}
}
```