Advertisement
lmarioza

Untitled

Oct 6th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <unordered_map>
  3. #define maxn 11
  4. #define smaxn 400
  5. #define F first
  6. #define S second
  7. #define mp make_pair
  8.  
  9. using namespace std;
  10.  
  11. struct Block {
  12.     int ini, fim, qtd;
  13.     Block() {
  14.         ini = fim = -1;
  15.         qtd = 0;
  16.     }
  17. };
  18.  
  19. int bs;
  20. Block sum[smaxn];
  21. int v[maxn];
  22. unordered_map<int,pair<int,pair<int,int> > > pos;
  23. int n;
  24.  
  25. int query(int l,int r) {
  26.     //printf("Q %d %d\n",l,r );
  27.     int ans = 0;
  28.  
  29.     while(l!=sum[pos[l].F].ini && l!=r ){
  30.         ans++;
  31.         l = pos[l].S.S;
  32.     }
  33.  
  34.     while(pos[l].F < pos[r].F){
  35.         ans+=bs;
  36.         l = sum[pos[l].F+1].ini;
  37.     }
  38.  
  39.     while(l!=r){
  40.         ans++;
  41.         l = pos[l].S.S;
  42.     }
  43.     return ans+1;
  44. }
  45.  
  46.  
  47. int insert(int p, int e) {
  48.     int bloco = pos[p].F;
  49.     if(sum[bloco].fim == p){
  50.         bloco++;
  51.     }
  52.     int prox = pos[p].S.S;
  53.     pos[prox].S.F = e;
  54.     pos[p].S.S = e;
  55.  
  56.     pos[e].F = bloco;
  57.     pos[e].S.F = p;
  58.     pos[e].S.S = prox;
  59.  
  60.     while(sum[bloco].qtd ==bs){
  61.         int ult = sum[bloco].fim;
  62.         sum[bloco+1].ini = sum[bloco].fim;
  63.         sum[bloco].fim = pos[ult].S.F;
  64.         pos[ult].F++;
  65.         bloco++;
  66.     }
  67.     int ult = sum[bloco].fim;
  68.     sum[bloco+1].ini = sum[bloco].fim;
  69.     sum[bloco].fim = pos[ult].S.F;
  70.     sum[bloco].qtd++;
  71. }
  72.  
  73.  
  74. int remove(int p) {
  75.     int bloco = pos[p].F;
  76.  
  77.     pos[pos[p].S.F].S.S =pos[p].S.S;
  78.     pos[pos[p].S.S].S.F =pos[p].S.F;
  79.    
  80.     bloco++;
  81.     while(sum[bloco].qtd ==bs){
  82.         int prim = sum[bloco].ini;
  83.         sum[bloco-1].fim = sum[bloco].ini;
  84.         sum[bloco].ini = pos[prim].S.S;
  85.         pos[prim].F--;
  86.         bloco++;
  87.     }
  88.     int prim = sum[bloco].ini;
  89.     sum[bloco-1].fim = sum[bloco].ini;
  90.     sum[bloco].ini = pos[prim].S.S;
  91.     sum[bloco].qtd--;
  92. }
  93.  
  94.  
  95. void build () {
  96.     int k=0;       
  97.     pos[-1] = mp(-1,mp(-1,-1));
  98.     for(int i=0;i<bs;i++){
  99.         int ac=0;
  100.         sum[i].ini = v[k];
  101.         for(int j=0;j<bs;j++){
  102.  
  103.             pos[v[k]].F = i;
  104.             pos[v[k]].S.F = !k?-1:v[k-1];
  105.             pos[v[k]].S.S = v[k+1];
  106.  
  107.             printf("%d %d %d %d %d\n",k,v[k],pos[v[k]].F,pos[v[k]].S.F,pos[v[k]].S.S );
  108.  
  109.             ac++;
  110.             k++;
  111.             if (v[k] == -1) break;
  112.         }
  113.         sum[i].fim = v[k-1];
  114.         sum[i].qtd = ac;       
  115.         if (v[k] == -1) break;
  116.     }
  117. }
  118.  
  119. void printlist(){
  120.     int i = sum[0].ini;
  121.     printf("--%d\n",i);
  122.     while(i!=-1 && i){
  123.         printf("%d\n",i );
  124.         i = pos[i].S.S;
  125.     }
  126.     printf("--\n");
  127. }
  128.  
  129. int main () {
  130.     scanf("%d", &n);   
  131.     bs =sqrt(maxn);
  132.     memset(v, -1, sizeof v);   
  133.  
  134.     for (int i = 0; i < n; i++) {
  135.        
  136.         scanf("%d", v+i);
  137.     }
  138.     build();
  139.     /*for(int i=0;i<2;i++){
  140.         printf("%d %d\n",sum[i].ini,sum[i].fim);
  141.     }
  142.     printf("\n");*/
  143.     int q; scanf("%d", &q);
  144.  
  145.     while(q--) {
  146.         printlist();
  147.         char c; scanf(" %c", &c);
  148.         if (c == 'I') {
  149.             int p, e; scanf("%d %d", &p, &e);
  150.             insert(e,p);
  151.         } else if (c == 'R') {
  152.             int e; scanf("%d", &e);
  153.             remove(e);
  154.         } else {
  155.             int a, b; scanf("%d %d", &a, &b);
  156.             printf("%d\n",query(pos[a].S.S,pos[b].S.F) );
  157.         }
  158.     }
  159.  
  160.     return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement