1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include <bits/stdc++.h> #define int long long using namespace std;
int n, m, q, x, y, rt[300005], ps, val; vector<int> num[300005]; struct Segtree { int tr[4000005], ls[4000005], rs[4000005], cnt; void update(int l, int r, int& p, int s) { if(!p) p = ++cnt; if(l == r) return tr[p] = 1, void(); int mid = (l + r) >> 1; if(s <= mid) update(l, mid, ls[p], s); else update(mid + 1, r, rs[p], s); tr[p] = tr[ls[p]] + tr[rs[p]]; return; } int query(int l, int r, int& p, int d) { if(!p) p = ++cnt; if(l == r) return l; int mid = (l + r) >> 1, tmp = (mid - l + 1) - tr[ls[p]]; if(d > tmp) return query(mid + 1, r, rs[p], d - tmp); else return query(l, mid, ls[p], d); } } tr;
signed main() { scanf("%lld %lld %lld", &n, &m, &q); for(int _ = 1; _ <= q; ++_) { scanf("%lld %lld", &x, &y); if(y < m) { ps = tr.query(1, m - 1 + q, rt[x], y); if(ps < m) val = (x - 1) * m + ps; else val = num[x][ps - m]; printf("%lld\n", val); num[n + 1].push_back(val); tr.update(1, m - 1 + q, rt[x], ps); ps = tr.query(1, n + q, rt[n + 1], x); if(ps <= n) val = ps * m; else val = num[n + 1][ps - n - 1]; num[x].push_back(val); tr.update(1, n + q, rt[n + 1], ps); } else { ps = tr.query(1, n + q, rt[n + 1], x); if(ps <= n) val = ps * m; else val = num[n + 1][ps - n - 1]; printf("%lld\n", val); num[n + 1].push_back(val); tr.update(1, n + q, rt[n + 1], ps); } } return 0; }
|