Advertisement
Guest User

Untitled

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