niyaznigmatullin

Untitled

May 4th, 2014
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3.  
  4.  
  5. struct SegmentTree {
  6.   std::vector<int> sum;
  7.   int n;
  8.    
  9.   SegmentTree(int m) {
  10.     n = 1;
  11.     while (n < m) n *= 2;
  12.     sum.assign(2 * n, 0);
  13.   }
  14.  
  15.   int getSum(int left, int right) {
  16.     --right;
  17.     left += n;
  18.     right += n;
  19.     int ret = 0;
  20.     while (left <= right) {
  21.       if ((left & 1) == 1) {
  22.         ret += sum[left++];
  23.       }
  24.       if ((right & 1) == 0) {
  25.         ret += sum[right--];
  26.       }
  27.       left >>= 1;
  28.       right >>= 1;
  29.     }
  30.     return ret;
  31.   }
  32.    
  33.   int getNext(int x) {
  34.     int k = getSum(0, x) + 1;
  35.     if (getSum(0, n) < k) {
  36.       k = 1;
  37.     }
  38.     int v = 1;
  39.     int left = 0;
  40.     int right = n;
  41.     while (left < right - 1) {
  42.       int mid = (left + right) >> 1;
  43.       if (sum[2 * v] >= k) {
  44.         right = mid;
  45.         v = 2 * v;
  46.       } else {
  47.         k -= sum[2 * v];
  48.         left = mid;
  49.         v = 2 * v + 1;
  50.       }
  51.     }
  52.     return left;
  53.   }
  54.    
  55.   void add(int x, int y) {
  56.     x += n;
  57.     sum[x] += y;
  58.     while (x > 1) {
  59.       x >>= 1;
  60.       sum[x] = sum[2 * x] + sum[2 * x + 1];
  61.     }
  62.   }
  63. };
  64.  
  65.  
  66. int main() {
  67.   std::ifstream fin("parking.in");
  68.   std::ofstream fout("parking.out");
  69.   int n, m;
  70.   fin >> n >> m;
  71.   SegmentTree tree(n);
  72.   for (int i = 0; i < n; i++) tree.add(i, 1);
  73.   for (int i = 0; i < m; i++) {
  74.     std::string s;
  75.     int x;
  76.     fin >> s >> x;
  77.     --x;
  78.     if (s == "enter") {
  79.       int id = tree.getNext(x);
  80.       tree.add(id, -1);
  81.       fout << id + 1 << '\n';
  82.     } else {
  83.       tree.add(x, 1);
  84.     }
  85.   }
  86. }
Advertisement
Add Comment
Please, Sign In to add comment