Advertisement
Guest User

ORDERSET на spoj.pl

a guest
Sep 28th, 2011
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.52 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdio>
  3.  
  4. const int MAXH = 18; // 262144
  5. int tree[1<<MAXH];
  6.  
  7. void add(int index, int delta)
  8. {
  9.     for (int i = index; i < (1<<MAXH); i |= (i+1)) tree[i] += delta;
  10. }
  11.  
  12. int cums(int index)
  13. {
  14.     int result = 0;
  15.     for (int i = index+1; i >= 1; i &= (i+1)) result += tree[--i];
  16.  
  17.     return result;
  18. }
  19.  
  20. int find(int sum)
  21. {
  22.     int i = (1<<MAXH)-1; if (tree[i] < sum) return -1;
  23.  
  24.     for (int h = MAXH-1; h >= 0; --h)
  25.         if (tree[i - (1<<h)] >= sum) i = i - (1<<h); else sum -= tree[i - (1<<h)];
  26.    
  27.     return i;
  28. }
  29.  
  30. const int MAXOP = 200000;
  31. int x[MAXOP], coords[MAXOP], NC;
  32. char op[MAXOP], tmp[2];
  33. bool mark[MAXOP];
  34.  
  35. int main()
  36. {
  37.     int Q; scanf("%d", &Q);
  38.  
  39.     for (int i = 0; i < Q; ++i) { scanf("%s", tmp); op[i] = tmp[0]; scanf("%d", &x[i]); }
  40.  
  41.     std::copy(&x[0], &x[Q], &coords[0]);
  42.     std::sort(&coords[0], &coords[Q]);
  43.     NC = std::unique(&coords[0], &coords[Q]) - &coords[0];
  44.    
  45.     for (int i = 0; i < Q; ++i)
  46.     {
  47.         if (op[i] != 'K') x[i] = std::lower_bound(&coords[0], &coords[NC], x[i]) - &coords[0];
  48.  
  49.         int res;
  50.  
  51.         switch (op[i])
  52.         {
  53.             case 'I': if (!mark[x[i]]) { mark[x[i]] = true; add(x[i], 1); } break;
  54.             case 'D': if (mark[x[i]]) { mark[x[i]] = false; add(x[i], -1); } break;
  55.  
  56.             case 'K': res = find(x[i]); if (res != -1) printf("%d\n", coords[res]); else printf("invalid\n"); break;
  57.             case 'C': printf("%d\n", cums(x[i]-1)); break;
  58.         }
  59.     }
  60.    
  61.     return 0;
  62. }
  63.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement