Manioc

F AAA

Sep 4th, 2019
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. #define MAX 100007
  3.  
  4. using namespace std;
  5. typedef long long ll;
  6. typedef pair<int, int> pii;
  7. typedef pair<int, pii> piii;
  8.  
  9. struct Node {
  10.     int qt, l, r;
  11.     Node():qt(0),l(0),r(0){}
  12. } st[100*MAX];
  13.  
  14. int ptr = 1;
  15.  
  16. int update(int node, int l, int r, int p, int v){
  17.     if(p < l || r < p) return node;
  18.     if(l == r){
  19.         st[ptr].qt = v;
  20.         st[ptr].l = st[node].l;
  21.         st[ptr].r = st[node].r;
  22.         return ptr++;
  23.     }
  24.  
  25.     int mid = (l+r)>>1;
  26.     int fe = update(st[node].l, l, mid, p, v);
  27.     int fd = update(st[node].r, mid+1,r,p, v);
  28.  
  29.     st[ptr].qt = st[fe].qt + st[fd].qt;
  30.     st[ptr].l = fe;
  31.     st[ptr].r = fd;
  32.     return ptr++;
  33. }
  34.  
  35. int cpy(int node, int ins, int l, int r, int x, int y){
  36.     if(y < l || r < x) return node;
  37.     if(x <= l && r <= y) return ins;
  38.  
  39.     int mid = (l+r)>>1;
  40.     int fe = update(st[node].l, st[ins].l, l, mid, p, v);
  41.     int fd = update(st[node].r, st[ins].r, mid+1,r,p, v);
  42.  
  43.     st[ptr].qt = st[fe].qt + st[fd].qt;
  44.     st[ptr].l = fe;
  45.     st[ptr].r = fd;
  46.     return ptr++;
  47. }
  48.  
  49. int query(int a, int b, int l, int r, int k){
  50.     if(l==r) return l;
  51.  
  52.     int mid = (l+r)>>1;
  53.  
  54.     int vv = st[st[b].l].qt - st[st[a].l].qt;
  55.     if(vv >= k) return query(st[a].l, st[b].l, l, mid, k);
  56.     return query(st[a].r, st[b].r, mid+1, r, k-vv);
  57. }
  58.  
  59. int black[MAX], white[MAX];
  60. int main(){
  61.     int n, m, q; scanf("%d %d %d", &n, &m, &q);
  62.    
  63.     black[0] = new node();
  64.     for(int i = 0; i < n*m; i++) black[0] = update(black[0], 0, MAX, i, 1);
  65.  
  66.     int actual = 1;
  67.     while(q--){
  68.         int t; scanf("%d", &t);
  69.         if(t == 1){
  70.             int i, j; scanf("%d %d", &i, &j);
  71.             i--; j--;
  72.             white[actual] = update(white[actual-1], 0, MAX, i*n + j, 1);
  73.             black[actual] = update(black[actual-1], 0, MAX, i*n + j, 0);
  74.             printf("%d\n", query(white[actual], 0, MAX, 0, MAX));
  75.             actual++;
  76.         }else if(t == 2){
  77.             int i, j; scanf("%d %d", &i, &j);
  78.             i--; j--;
  79.             white[actual] = update(white[actual-1], 0, MAX, i*n + j, 0);
  80.             black[actual] = update(black[actual-1], 0, MAX, i*n + j, 1);
  81.             printf("%d\n", query(white[actual], 0, MAX, 0, MAX));
  82.             actual++;
  83.         }else if(t == 3){
  84.             int i; scanf("%d", &i);
  85.             i--;
  86.             white[actual] = cpy(white[actual-1], black[actual-1], 0, MAX, i*n, i*n + m);
  87.             black[actual] = cpy(black[actual-1], white[actual-1], 0, MAX, i*n, i*n + m);
  88.             printf("%d\n", query(white[actual], 0, MAX, 0, MAX));
  89.             actual++;
  90.         }else {
  91.             int i; scanf("%d", &i); actual = i;
  92.             printf("%d\n", query(white[actual], 0, MAX, 0, MAX));
  93.             actual++;
  94.         }
  95.     }
  96.     return 0;
  97. }
  98.  
  99. // https://discuss.codechef.com/t/persistence-made-simple-tutorial/14915
Advertisement
Add Comment
Please, Sign In to add comment