Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- #define MAX 100007
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> pii;
- typedef pair<int, pii> piii;
- struct Node {
- int qt, l, r;
- Node():qt(0),l(0),r(0){}
- } st[100*MAX];
- int ptr = 1;
- int update(int node, int l, int r, int p, int v){
- if(p < l || r < p) return node;
- if(l == r){
- st[ptr].qt = v;
- st[ptr].l = st[node].l;
- st[ptr].r = st[node].r;
- return ptr++;
- }
- int mid = (l+r)>>1;
- int fe = update(st[node].l, l, mid, p, v);
- int fd = update(st[node].r, mid+1,r,p, v);
- st[ptr].qt = st[fe].qt + st[fd].qt;
- st[ptr].l = fe;
- st[ptr].r = fd;
- return ptr++;
- }
- int cpy(int node, int ins, int l, int r, int x, int y){
- if(y < l || r < x) return node;
- if(x <= l && r <= y) return ins;
- int mid = (l+r)>>1;
- int fe = update(st[node].l, st[ins].l, l, mid, p, v);
- int fd = update(st[node].r, st[ins].r, mid+1,r,p, v);
- st[ptr].qt = st[fe].qt + st[fd].qt;
- st[ptr].l = fe;
- st[ptr].r = fd;
- return ptr++;
- }
- int query(int a, int b, int l, int r, int k){
- if(l==r) return l;
- int mid = (l+r)>>1;
- int vv = st[st[b].l].qt - st[st[a].l].qt;
- if(vv >= k) return query(st[a].l, st[b].l, l, mid, k);
- return query(st[a].r, st[b].r, mid+1, r, k-vv);
- }
- int black[MAX], white[MAX];
- int main(){
- int n, m, q; scanf("%d %d %d", &n, &m, &q);
- black[0] = new node();
- for(int i = 0; i < n*m; i++) black[0] = update(black[0], 0, MAX, i, 1);
- int actual = 1;
- while(q--){
- int t; scanf("%d", &t);
- if(t == 1){
- int i, j; scanf("%d %d", &i, &j);
- i--; j--;
- white[actual] = update(white[actual-1], 0, MAX, i*n + j, 1);
- black[actual] = update(black[actual-1], 0, MAX, i*n + j, 0);
- printf("%d\n", query(white[actual], 0, MAX, 0, MAX));
- actual++;
- }else if(t == 2){
- int i, j; scanf("%d %d", &i, &j);
- i--; j--;
- white[actual] = update(white[actual-1], 0, MAX, i*n + j, 0);
- black[actual] = update(black[actual-1], 0, MAX, i*n + j, 1);
- printf("%d\n", query(white[actual], 0, MAX, 0, MAX));
- actual++;
- }else if(t == 3){
- int i; scanf("%d", &i);
- i--;
- white[actual] = cpy(white[actual-1], black[actual-1], 0, MAX, i*n, i*n + m);
- black[actual] = cpy(black[actual-1], white[actual-1], 0, MAX, i*n, i*n + m);
- printf("%d\n", query(white[actual], 0, MAX, 0, MAX));
- actual++;
- }else {
- int i; scanf("%d", &i); actual = i;
- printf("%d\n", query(white[actual], 0, MAX, 0, MAX));
- actual++;
- }
- }
- return 0;
- }
- // https://discuss.codechef.com/t/persistence-made-simple-tutorial/14915
Advertisement
Add Comment
Please, Sign In to add comment