Advertisement
999ms

Untitled

Mar 14th, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define endl "\n"
  3. using namespace std;
  4. typedef long long ll;
  5.  
  6. struct node{
  7.     node * l = nullptr, * r = nullptr;
  8.     int cnt=0;
  9.     int dif=0;
  10.     int uni=0;
  11.     node(){}
  12.     node(node * left, node * right){
  13.         l = left;
  14.         r = right;
  15.         cnt = left->cnt + right->cnt;
  16.         dif = left->dif + right->dif;
  17.         uni = left->uni + right->uni;
  18.     }
  19.     node(int c){
  20.         cnt = c;
  21.         dif = 1;
  22.         uni = c == 1;
  23.     }
  24. };
  25. typedef node* pnode;
  26.  
  27. vector<pnode> versions;
  28.  
  29. pnode build(int tl, int tr){
  30.     if(tl == tr){
  31.         return new node();
  32.     } else {
  33.         int tm = (tl + tr) / 2;
  34.         return new node(build(tl, tm), build(tm+1, tr));
  35.     }  
  36. }
  37.  
  38. int different(int v){
  39.     return versions[v]->dif;
  40. }
  41.  
  42. int unique(int v){
  43.     return versions[v]->uni;
  44. }
  45.  
  46. int count(pnode v, int tl, int tr, int val){
  47.     if(tl == tr){
  48.         return v->cnt;
  49.     } else {
  50.         int tm = (tl + tr) / 2;
  51.         if(tm >= val) {
  52.             return count(v->l, tl, tm, val);
  53.         } else {
  54.             return count(v->r, tm + 1, tr, val);
  55.         }
  56.     }
  57. }
  58.  
  59. pnode add(pnode v, int tl, int tr, int val){
  60.     if(tl == tr){
  61.         return new node(v->cnt + 1);
  62.     } else {
  63.         int tm = (tl + tr) / 2;
  64.         if(tm >= val) {
  65.             return new node(add(v->l, tl, tm, val), v->r);
  66.         } else {
  67.             return new node(v->l,add(v->r, tm+1, tr, val));
  68.         }  
  69.     }
  70. }  
  71.  
  72. pnode remove(pnode v, int tl, int tr, int val){
  73.     if(tl == tr){
  74.         if(v->cnt == 0) return nullptr;
  75.         return new node(v->cnt - 1);
  76.     } else {
  77.         int tm = (tl + tr) / 2;
  78.         if(tm >= val) {
  79.             pnode nxt_l = remove(v->l, tl, tm, val);
  80.             if(nxt_l == nullptr) return nullptr;
  81.             return new node(nxt_l, v->r);
  82.         } else {
  83.             pnode nxt_r = remove(v->r, tm+1, tr, val);
  84.             if(nxt_r == nullptr) return nullptr;
  85.             return new node(v->l, nxt_r);
  86.         }  
  87.     }
  88. }
  89. int n,m;
  90. int main(){
  91.   ios_base::sync_with_stdio(false);
  92.   cin.tie(nullptr);
  93.     cin>>n>>m;
  94.     versions.push_back(build(1, m));
  95.     int s = 0;
  96.     string type;
  97.     int v,x,y;
  98.     int value;
  99.     for(int i=1;i<=n;i++){
  100.         cin>>type;
  101.         if(type[0]=='a'){
  102.             cin>>x;
  103.             versions.push_back(add(versions[i-1], 1, m, x));
  104.         } else if (type[0]=='r') {
  105.             cin>>x;
  106.             pnode ans = remove(versions[i-1], 1, m, x);
  107.             if(ans == nullptr){
  108.                 versions.push_back(versions[i-1]);
  109.             } else {
  110.                 versions.push_back(ans);
  111.             }
  112.         } else if (type[0]=='d') {
  113.             cin>>y;
  114.             v = (y + s) % i;
  115.             v = different(v);
  116.             s+=v;
  117.             cout<<v<<endl;
  118.             versions.push_back(versions[i-1]);
  119.         } else if (type[0]=='u') { 
  120.             cin>>y;
  121.             v = (y + s) % i;
  122.             v = unique(v);
  123.             s+=v;
  124.             cout<<v<<endl;
  125.             versions.push_back(versions[i-1]);
  126.         }   else if (type[0]=='c')  {
  127.             cin>>x>>y;
  128.             v = (y + s) % i;
  129.             v = count(versions[v], 1, m, x);
  130.             s += v;
  131.             cout<<v<<endl;
  132.             versions.push_back(versions[i-1]);   
  133.         }
  134.     }
  135.   return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement