Guest User

KQuery 2

a guest
Jan 23rd, 2016
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.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-9;
  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);
  9. typedef pair<int ,int> ii;
  10. typedef unsigned long long ULL;
  11. const int N=30001;
  12. struct Node{
  13.     int freq,sz,height,val;
  14.     Node*l,*r;
  15.     Node(){
  16.         l=r=NULL;
  17.         freq = sz = height = val = 0;
  18.     }
  19.     Node(int val){
  20.         freq = sz = height = 1;
  21.         this->val = val;
  22.     }
  23.     void fix(){
  24.         int lh = l?l->height:0;
  25.         int rh = r?r->height:0;
  26.         int ls = l?l->sz:0;
  27.         int rs = r?r->sz:0;
  28.         height = max(lh,rh)+1;
  29.         sz = ls+rs+freq;
  30.     }
  31.     int fb(){
  32.         int lh = l?l->height:0;
  33.         int rh = r?r->height:0;
  34.         return lh-rh;
  35.     }
  36. };
  37.  
  38. void lrotate(Node* &node){
  39.     Node* temp = node->r;
  40.     node->r = temp->l;
  41.     temp->l = node;
  42.     node->fix();
  43.     node = temp;
  44.     node->fix();
  45. }
  46.  
  47. void rrotate(Node* &node){
  48.     Node* temp = node->l;
  49.     node->l = temp->r;
  50.     temp->r = node;
  51.     node->fix();
  52.     node = temp;
  53.     node->fix();
  54. }
  55.  
  56. void rotate(Node* &node){
  57.     if (node->fb()>1){
  58.         if (node->l->fb()<0)
  59.             lrotate(node->l);
  60.         rrotate(node);
  61.     }
  62.     else if (node->fb()<-1){
  63.         if (node->r->fb()>0)
  64.             rrotate(node->r);
  65.         lrotate(node);
  66.     }
  67. }
  68.  
  69. Node* getMin(Node* node){
  70.     if (!node->l) return node;
  71.     return getMin(node->l);
  72. }
  73.  
  74. void insert(Node* &node,int val){
  75.     if (!node){
  76.         node = new Node(val);
  77.         return;
  78.     }
  79.     if (node->val==val){
  80.         node->freq++;
  81.     }
  82.     else if (node->val>val){
  83.         insert(node->l,val);
  84.     }
  85.     else{
  86.         insert(node->r,val);
  87.     }
  88.     node->fix();
  89.     rotate(node);
  90. }
  91.  
  92. void remove(Node* &node,int val){
  93.     if (!node) return;
  94.     if (node->val > val) remove(node->l,val);
  95.     else if (node->val < val) remove(node->r,val);
  96.     else{
  97.         if (node->freq>1) node->freq--;
  98.         else{
  99.             if (!node->r || !node-> l){
  100.                 Node* temp = node->l?node->l:node->r;
  101.                 node = temp;
  102.                 return;
  103.             }
  104.             else{
  105.                 Node* temp = getMin(node->r);
  106.                 int t = temp->freq;
  107.                 temp->freq = 1;
  108.                 remove(node->r,temp->val);
  109.                 temp->freq = t;
  110.                 temp->l = node->l;
  111.                 temp->r = node->r;
  112.                 node = temp;
  113.             }
  114.         }
  115.     }
  116.     node->fix();
  117.     rotate(node);
  118. }
  119.  
  120. int query(Node* node,int val){
  121.     if (!node) return 0;
  122.     if (node->val > val) return query(node->l,val);
  123.     if (node->val < val) return node->freq + (node->l?node->l->sz:0)+query(node->r,val);
  124.     return node->freq + (node->l?node->l->sz:0);
  125. }
  126.  
  127. Node* tree[N*4];
  128. int n,q;
  129. int arr[N];
  130.  
  131. void sInsert(int node,int l,int r,int idx,int val){
  132.     insert(tree[node],val);
  133.     if (l==r) return;
  134.     int mid = (l+r)>>1;
  135.     if (idx<=mid) sInsert(node<<1,l,mid,idx,val);
  136.     else sInsert(node<<1|1,mid+1,r,idx,val);
  137. }
  138.  
  139. void sRemove(int node,int l,int r,int idx,int val,int val2){
  140.     remove(tree[node],val);
  141.     insert(tree[node],val2);
  142.     if (l==r){
  143.         arr[l]=val2;
  144.         return;
  145.     }
  146.     int mid = (l+r)>>1;
  147.     if (idx<=mid) sRemove(node<<1,l,mid,idx,val,val2);
  148.     else sRemove(node<<1|1,mid+1,r,idx,val,val2);
  149. }
  150.  
  151. int sQuery(int node,int l,int r,int ll,int rr,int val){
  152.     if (l>rr || r<ll) return 0;
  153.     if (l>=ll && r<=rr) return query(tree[node],val);
  154.     int mid = (l+r)>>1;
  155.     return sQuery(node<<1,l,mid,ll,rr,val)+sQuery(node<<1|1,mid+1,r,ll,rr,val);
  156. }
  157. int main(){
  158. #ifndef ONLINE_JUDGE
  159.     readFile;
  160. //    writeFile;
  161. #endif
  162.     fastIO;
  163.     scanf("%d",&n);
  164.     for(int i=1;i<=n;i++){
  165.         scanf("%d",&arr[i]);
  166.         sInsert(1,1,n,i,arr[i]);
  167.     }
  168.     scanf("%d",&q);
  169.     while (q--){
  170.         int t; scanf("%d",&t);
  171.         if (t){
  172.             int i,j,k; scanf("%d%d%d",&i,&j,&k);
  173.             printf("%d\n",j-i+1-sQuery(1,1,n,i,j,k));
  174.         }
  175.         else{
  176.             int i,v; scanf("%d%d",&i,&v);
  177.             sRemove(1,1,n,i,arr[i],v);
  178.         }
  179.     }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment