Advertisement
Guest User

Untitled

a guest
Feb 9th, 2016
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const long long mod = 1e9 + 7;
  4. const double eps = 1e-15;
  5. const double PI = atan(1.0);
  6. #define readFile freopen("input","r",stdin)
  7. #define writeFile freopen("output","w",stdout)
  8. #define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  9. typedef pair<int,long long> ii;
  10. typedef unsigned long long ULL;
  11. const int N = 50003;
  12. const int inf = N-1;
  13.  
  14. struct xorShift{
  15. private:
  16.     ULL x,y,z,w;
  17. public:
  18.     xorShift(){
  19.         srand(time(NULL));
  20.     }
  21.     int next(){
  22.         return rand();
  23.     }
  24. };
  25.  
  26. xorShift gen = xorShift();
  27.  
  28. struct treap{
  29.     int nxt,val;
  30.     long long sz;
  31.     ULL p;
  32.     treap *l,*r;
  33.     treap(){}
  34.     treap(ii val){
  35.         this->nxt = val.first;
  36.         this->val = val.second;
  37.         l = r = NULL;
  38.         p = gen.next();
  39.     }
  40. };
  41. #define pnode treap*
  42.  
  43. inline long long sz(pnode node){
  44.     return node?node->sz:0;
  45. }
  46.  
  47. inline void usz(pnode node){
  48.     if (node)
  49.         node->sz = sz(node->l)+sz(node->r)+node->val;
  50. }
  51.  
  52. void split(pnode node,pnode &l,pnode &r,int key){
  53.     if (!node) l = r = NULL;
  54.     else if (node->nxt<=key) split(node->r,node->r,r,key),l = node;
  55.     else split(node->l,l,node->l,key),r = node;
  56.     usz(node);
  57. }
  58.  
  59. void merge(pnode &node,pnode l,pnode r){
  60.     if (!l||!r) node = l?l:r;
  61.     else if (l->p>r->p) merge(l->r,l->r,r),node = l;
  62.     else merge(r->l,l,r->l),node = r;
  63.     usz(node);
  64. }
  65.  
  66. void tinsert(pnode &node,pnode &ins){
  67.     if (!node) node = ins;
  68.     else if (node->p<ins->p){
  69.         split(node,ins->l,ins->r,ins->nxt);
  70.         node = ins;
  71.     }
  72.     else tinsert(ins->nxt<=node->nxt?node->l:node->r,ins);
  73.     usz(node);
  74. }
  75.  
  76. inline bool eq(pnode node,ii val){
  77.     return node->nxt == val.first && node->val == val.second;
  78. }
  79.  
  80. void terase(pnode &node,ii val){
  81.     if (!node) return;
  82.     if (eq(node,val)){
  83.         pnode temp = node;
  84.         merge(node,node->l,node->r);
  85.         free(temp);
  86.     }
  87.     else terase(val.first<=node->nxt?node->l:node->r,val);
  88.     usz(node);
  89. }
  90.  
  91. //long long tquery(pnode &node,int val){
  92. //    pnode l; pnode r;
  93. //    split(node,l,r,val);
  94. //    long long res = sz(r);
  95. //    merge(node,l,r);
  96. //    return res;
  97. //}
  98.  
  99. long long tquery(pnode node, int val){
  100.     if (!node) return 0;
  101.     if (node->nxt>val) return sz(node->r)+node->val+tquery(node->l,val);
  102.     return tquery(node->r,val);
  103. }
  104.  
  105. pnode tree[N*4];
  106.  
  107. void insert(int node,int l,int r,int idx,ii val){
  108.     pnode temp = new treap(val);
  109.     tinsert(tree[node],temp);
  110.     if (l==r) return;
  111.     int mid = (l+r)>>1;
  112.     if (idx<=mid) insert(node<<1,l,mid,idx,val);
  113.     else insert(node<<1|1,mid+1,r,idx,val);
  114. }
  115.  
  116. void update(int node,int l,int r,int idx,ii old,ii val){
  117.     terase(tree[node],old);
  118.     pnode temp = new treap(val);
  119.     tinsert(tree[node],temp);
  120.     if (l==r) return;
  121.     int mid = (l+r)>>1;
  122.     if (idx<=mid) update(node<<1,l,mid,idx,old,val);
  123.     else update(node<<1|1,mid+1,r,idx,old,val);
  124. }
  125.  
  126. long long query(int node,int l,int r,int ll,int rr){
  127.     if (l>rr || r<ll) return 0;
  128.     if (l>=ll && r<= rr) return tquery(tree[node],rr);
  129.     int mid = (l+r)>>1;
  130.     return query(node<<1,l,mid,ll,rr)+query(node<<1|1,mid+1,r,ll,rr);
  131. }
  132. int n,m,a,b;
  133. ii arr[N];
  134. int nxt[N],arr1[N];
  135. map<int,set<int> > dict;
  136. char c;
  137.  
  138. #define sit set<int>::iterator
  139. inline void process1(int a){
  140.     sit it = dict[arr1[a]].lower_bound(a);
  141.     if (it!=dict[arr1[a]].begin()){
  142.         it--;
  143.         int idx = (*it);
  144.         update(1,1,n,idx,make_pair(nxt[idx],arr1[idx]),make_pair(nxt[a],arr1[idx]));
  145.         nxt[idx] = nxt[a];
  146. //        insert(1,1,n,idx,make_pair(nxt[idx],arr1[idx]));
  147.     }
  148. }
  149.  
  150. inline void process(int a,int b){
  151.     if (arr1[a]==b) return;
  152.     process1(a);
  153.     dict[arr1[a]].erase(a);
  154.     dict[b].insert(a);
  155.     sit it = dict[b].lower_bound(a);
  156.     if (it!=dict[b].begin()){
  157.         it--;
  158.         int idx = (*it);
  159.         int temp = nxt[idx];
  160.         update(1,1,n,idx,make_pair(nxt[idx],b),make_pair(a,b));
  161.         nxt[idx] = a;
  162.         update(1,1,n,a,make_pair(nxt[a],arr1[a]),make_pair(temp,b));
  163.         nxt[a] = temp;
  164.         arr1[a] = b;
  165.         return;
  166.     }
  167.     it++;
  168.     if (it!=dict[b].end()){
  169.         int idx = (*it);
  170.         update(1,1,n,a,make_pair(nxt[a],arr1[a]),make_pair(idx,b));
  171.         nxt[a] = idx;
  172.         arr1[a] = b;
  173.         return;
  174.     }
  175.     update(1,1,n,a,make_pair(nxt[a],arr1[a]),make_pair(inf,b));
  176.     nxt[a] = inf;
  177.     arr1[a] = b;
  178. }
  179.  
  180. int main(){
  181. #ifndef ONLINE_JUDGE
  182.     readFile;
  183. #endif
  184. //    scanf("%d\n",&n);
  185.     n = N-1;
  186.     for(int i=1;i<=n;i++)
  187.         arr[i].first = rand(),arr[i].second = i,dict[arr[i].first].insert(i),arr1[i]=arr[i].first;
  188.     for(int i=0;i<N;i++) nxt[i] = inf;
  189.     memset(tree,NULL,sizeof(tree));
  190.     sort(arr+1,arr+n+1);
  191.     for(int i=1;i<=n-1;i++){
  192.         cout<<i<<"\n";
  193.         if (arr[i].first==arr[i+1].first)
  194.             nxt[arr[i].second] = arr[i+1].second;
  195.         insert(1,1,n,arr[i].second,make_pair(nxt[arr[i].second],arr[i].first));
  196.     }
  197.     insert(1,1,n,arr[n].second,make_pair(nxt[arr[n].second],arr[n].first));
  198.     scanf("%d",&m);
  199.     while (m--){
  200.         scanf("\n%c%d%d",&c,&a,&b);
  201.         if (c=='Q') printf("%lld\n",query(1,1,n,a,b));
  202.         else process(a,b);
  203.     }
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement