package main import . "fmt" import . "os" import bf "bufio" func main() { rd := bf.NewReader(Stdin) wr := bf.NewWriter(Stdout) defer wr.Flush() var h,w,q int Fscan(rd,&h,&w,&q) count := h*w free := make(map[int]int) for ; q > 0; q-- { var y,x int Fscan(rd,&y,&x) if c, ok := free[x]; ok { t := y-1 count -= max(0, c-t) free[x] = min(c, t) } else { t := y-1 count -= h-t free[x] = t } Fprintln(wr, count) } } /* 考察 誰もいない初期で座れる席は H*W 個? 1人目が来たとき Y[1],X[1] に座る つまり X[1] 列目の 1~Y[1]-1 の席に座れる X[1] 列目の H 個から Y[1]-1 個に座れる席が減る 2人目が来たとき Y[2],X[2] に座る 1人目と同じ列 X[1]=X[2] 列目のケースについて考える Y[2] < Y[1]のとき X[2] 列目に座れる席は Y[1]-1 個から Y[2]-1 個に減る Y[2] > Y[1] のとき 座れる席は変化なし つまり、列ごとに座れる席の数を管理できればよい 列数は最大10^9なので全部の列を管理することはできない 入力の列Xの種類数だけ管理すればいい マップなどでまとめればいい、いわゆる座圧などの情報圧縮を使って配列での管理も可能かもだが 最小のYの値を保持するのでも座れる席数を保持するのでもどっちでもよさそうだが、計算どっちが楽? */