Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define endl "\n"
  4. typedef long long ll;
  5. using namespace std;
  6.  
  7. int arr[1000000][2];
  8. int middle;
  9. int k, n;
  10.  
  11. void update(ll i) {
  12.     ll z = i;
  13.     while (z != 0) {
  14.         z = (z - 1) / 2;
  15.         arr[z][0] = arr[2 * z + 1][0] * arr[2 * z + 1][1];
  16.         arr[z][1] = arr[2 * z + 2][0] * arr[2 * z + 2][1];
  17.     }
  18. }
  19.  
  20. void set_val(int x, int value) {
  21.     int t;
  22.     if (x > middle) {
  23.         t = x - n;
  24.     } else {
  25.         t = x + n;
  26.     }
  27.     arr[x][0] = value;
  28.     arr[x][1] = value;
  29.     arr[t][0] = value;
  30.     arr[t][1] = value;
  31.     update(x);
  32.     update(t);
  33.     if (value==1) cout << min(x, t) - k << endl;
  34. }
  35.  
  36. void build(ll l, ll r) {
  37.     if (l != 0) {
  38.         for (int i = l; i < r - 1; i = i + 2) {
  39.             arr[i / 2][0] = arr[i][0] * arr[i][1];
  40.             arr[i / 2][1] = arr[i + 1][0] * arr[i + 1][1];
  41.         }
  42.         build(l / 2, r / 2);
  43.     }
  44. }
  45.  
  46.  
  47. void fill(int p, int r) {
  48.     for (int i = p; i < r; i++) {
  49.         arr[i][0] = 1;
  50.         arr[i][1] = 1;
  51.     }
  52. }
  53.  
  54. bool enter(int pos, int x, int lx, int rx) {
  55.     if (pos >= rx || (arr[x][0] == 1 && arr[x][1] == 1)) {
  56.         return false;
  57.     }
  58.     if (rx - lx == 1) {
  59.         if (arr[x][0] == 0 && arr[x][1] == 0) {
  60.             set_val(x, 1);
  61.             return true;
  62.         } else return false;
  63.     }
  64.     int m = (lx + rx) / 2;
  65.     if (enter(pos, 2 * x + 1, lx, m)) { return true; }
  66.     else if (enter(pos, 2 * x + 2, m, rx)) { return true; }
  67.     return false;
  68. }
  69.  
  70.  
  71. int main() {
  72.     freopen("parking.in", "r", stdin);
  73.     freopen("parking.out", "w", stdout);
  74.     int m;
  75.     cin >> n >> m;
  76.     int round_places = 2 * n - 1;
  77.     int exp = ceil(log2(round_places));
  78.     int f = (1 << exp) - 1; // номера в дереве 1 == 7
  79.     k = f - 1;
  80.     int e = (1 << (exp + 1)) - 1; // номер последнего
  81.     fill(f + round_places, e);
  82.     build(f, e);
  83.     middle = (1 << exp) + n - 2; // номер среднего в дереве
  84.     for (int i = 0; i < m; i++) {
  85.         string requests;
  86.         int x;
  87.         cin >> requests >> x;
  88.         x += f - 1;
  89.         if (requests == "enter") {
  90.             enter(x, 0, f, e);
  91.         } else {
  92.             set_val(x, 0);
  93.         }
  94.     }
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement