Submission #881739

# Submission time Handle Problem Language Result Execution time Memory
881739 2023-12-01T20:10:58 Z MilosMilutinovic Segments (IZhO18_segments) C++14
7 / 100
5000 ms 46228 KB
#include <bits/stdc++.h>

using namespace std;

const int N = 2e5;
const int M = 20 * N;

int root[N][2], ls[M], rs[M], cnt[M], tsz;

void Modify(int& x, int y, int l, int r, int p) {
  x = ++tsz;
  ls[x] = ls[y];
  rs[x] = rs[y];
  cnt[x] = cnt[y] + 1;
  if (l == r) {
    return;
  }
  int mid = l + r >> 1;
  if (p <= mid) {
    Modify(ls[x], ls[y], l, mid, p);
  } else {
    Modify(rs[x], rs[y], mid + 1, r, p);
  }
}

int Query(int x, int l, int r, int ll, int rr) {
  if (ll <= l && r <= rr) {
    return cnt[x];
  }
  int mid = l + r >> 1;
  if (rr <= mid) {
    return Query(ls[x], l, mid, ll, rr);
  } else if (ll > mid) {
    return Query(rs[x], mid + 1, r, ll, rr);
  } else {
    return Query(ls[x], l, mid, ll, rr) + Query(rs[x], mid + 1, r, ll, rr);
  }
}

void clear_seg() {
  while (tsz > 0) {
    ls[tsz] = 0;
    rs[tsz] = 0;
    cnt[tsz] = 0;
    tsz--;
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, t;
  cin >> n >> t;
  vector<int> op(n), a(n), b(n), k(n);
  for (int i = 0; i < n; i++) {
    cin >> op[i];
    if (op[i] == 1) {
      cin >> a[i] >> b[i];
    }
    if (op[i] == 2) {
      cin >> a[i];
      --a[i];
    }
    if (op[i] == 3) {
      cin >> a[i] >> b[i] >> k[i];
    }
  }
  vector<int> vec;
  vector<int> idx(n);
  vector<int> to(n, n);
  for (int i = 0; i < n; i++) {
    if (op[i] == 1) {
      vec.push_back(i);
    }
    if (op[i] == 2) {
      idx[i] = vec[a[i]];
      to[idx[i]] = i;
    }
  }
  const int BLOCK = 350;
  int res = 0;
  for (int L = 0; L < n; L += BLOCK) {
    int R = min(L + BLOCK, n);
    vector<int> xs;
    for (int i = 0; i < L; i++) {
      if (op[i] == 1) {
        if (to[i] < L || to[i] >= R) {
          xs.push_back(a[i]);
          xs.push_back(b[i]);
          xs.push_back(b[i] - a[i] + 1);
        }
      }
    }
    sort(xs.begin(), xs.end());
    xs.erase(unique(xs.begin(), xs.end()), xs.end());
    int sz = (int) xs.size();
    vector<vector<pair<int, int>>> qs(sz);
    for (int i = 0; i < L; i++) {
      if (op[i] == 1) {
        if (to[i] >= R) {
          int ll = (int) (lower_bound(xs.begin(), xs.end(), a[i]) - xs.begin());
          int rr = (int) (lower_bound(xs.begin(), xs.end(), b[i]) - xs.begin());
          int len = (int) (lower_bound(xs.begin(), xs.end(), b[i] - a[i] + 1) - xs.begin());
          qs[rr].push_back({ll, len});
        }
      }
    }
    clear_seg();
    for (int i = sz - 1; i >= 0; i--) {
      if (i + 1 < sz) {
        root[i][0] = root[i + 1][0];
        root[i][1] = root[i + 1][1];
      } else {
        root[i][0] = 0;
        root[i][1] = 0;
      }
      for (auto &p : qs[i]) {
        Modify(root[i][0], root[i][0], 0, sz - 1, p.first);
        Modify(root[i][1], root[i][1], 0, sz - 1, p.second);
      }
    }
    vector<int> cur;
    for (int i = 0; i < R; i++) {
      if (op[i] == 1 && (i >= L || (to[i] >= L && to[i] < R))) {
        cur.push_back(i);
      }
    }
    for (int i = L; i < R; i++) {
      if (op[i] == 1) {
        a[i] = (a[i] ^ (t * res));
        b[i] = (b[i] ^ (t * res));
        if (a[i] > b[i]) {
          swap(a[i], b[i]);
        }
      }
      if (op[i] == 3) {
        a[i] = (a[i] ^ (t * res));
        b[i] = (b[i] ^ (t * res));
        if (a[i] > b[i]) {
          swap(a[i], b[i]);
        }
        res = 0;
        if (b[i] - a[i] + 1 < k[i]) {
          cout << 0 << '\n';
          continue;
        }
        for (int j : cur) {
          if (j < i && op[j] == 1 && to[j] >= i) {
            int ll = max(a[i], a[j]);
            int rr = min(b[i], b[j]);
            if (rr - ll + 1 >= k[i]) {
              res += 1;
            }
          }
        }
        int idx = -1;
        {
          int low = 0, high = sz - 1;
          while (low <= high) {
            int mid = low + high >> 1;
            if (xs[mid] >= k[i]) {
              idx = mid;
              high = mid - 1;
            } else {
              low = mid + 1;
            }
          }
        }
        {
          int low = 0, high = sz - 1, pos = -1;
          while (low <= high) {
            int mid = low + high >> 1;
            if (xs[mid] >= a[i] + k[i] - 1) {
              pos = mid;
              high = mid - 1;
            } else {
              low = mid + 1;
            }
          }
          if (pos != -1 && idx != -1) {
            res += Query(root[pos][1], 0, sz - 1, idx, sz - 1);
          }
        }
        {
          int low = 0, high = sz - 1, posR = -1;
          while (low <= high) {
            int mid = low + high >> 1;
            if (xs[mid] > b[i]) {
              posR = mid;
              high = mid - 1;
            } else {
              low = mid + 1;
            }
          }
          low = 0, high = sz - 1;
          int posL = -1;
          while (low <= high) {
            int mid = low + high >> 1;
            if (xs[mid] <= b[i] - k[i] + 1) {
              posL = mid;
              low = mid + 1;
            } else {
              high = mid - 1;
            }
          }
          if (posR != -1 && posL != -1) {
            res += Query(root[posR][0], 0, sz - 1, 0, posL);
          }
          if (posR != -1 && idx != -1) {
            res -= Query(root[posR][1], 0, sz - 1, idx, sz - 1);
          }
        }
        cout << res << '\n';
      }
    }
  }
  return 0;
}

Compilation message

segments.cpp: In function 'void Modify(int&, int, int, int, int)':
segments.cpp:18:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   18 |   int mid = l + r >> 1;
      |             ~~^~~
segments.cpp: In function 'int Query(int, int, int, int, int)':
segments.cpp:30:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   30 |   int mid = l + r >> 1;
      |             ~~^~~
segments.cpp: In function 'int main()':
segments.cpp:160:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  160 |             int mid = low + high >> 1;
      |                       ~~~~^~~~~~
segments.cpp:172:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  172 |             int mid = low + high >> 1;
      |                       ~~~~^~~~~~
segments.cpp:187:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  187 |             int mid = low + high >> 1;
      |                       ~~~~^~~~~~
segments.cpp:198:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  198 |             int mid = low + high >> 1;
      |                       ~~~~^~~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 5 ms 2908 KB Output is correct
4 Correct 5 ms 2908 KB Output is correct
5 Correct 24 ms 6560 KB Output is correct
6 Correct 24 ms 6352 KB Output is correct
7 Correct 10 ms 3260 KB Output is correct
8 Correct 21 ms 6088 KB Output is correct
9 Correct 20 ms 5984 KB Output is correct
10 Correct 24 ms 6616 KB Output is correct
11 Correct 19 ms 5956 KB Output is correct
12 Correct 19 ms 6152 KB Output is correct
13 Correct 24 ms 6656 KB Output is correct
14 Correct 19 ms 5956 KB Output is correct
15 Correct 6 ms 2908 KB Output is correct
16 Correct 6 ms 2908 KB Output is correct
17 Correct 15 ms 3572 KB Output is correct
18 Correct 26 ms 6400 KB Output is correct
19 Correct 15 ms 3536 KB Output is correct
20 Correct 16 ms 3620 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 5059 ms 41080 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1200 ms 10728 KB Output is correct
2 Correct 1191 ms 10704 KB Output is correct
3 Correct 1262 ms 10896 KB Output is correct
4 Correct 1205 ms 10608 KB Output is correct
5 Execution timed out 5028 ms 45936 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1214 ms 10992 KB Output is correct
2 Correct 1212 ms 10996 KB Output is correct
3 Correct 1196 ms 10912 KB Output is correct
4 Correct 1208 ms 10728 KB Output is correct
5 Execution timed out 5068 ms 46228 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 5 ms 2908 KB Output is correct
4 Correct 5 ms 2908 KB Output is correct
5 Correct 24 ms 6560 KB Output is correct
6 Correct 24 ms 6352 KB Output is correct
7 Correct 10 ms 3260 KB Output is correct
8 Correct 21 ms 6088 KB Output is correct
9 Correct 20 ms 5984 KB Output is correct
10 Correct 24 ms 6616 KB Output is correct
11 Correct 19 ms 5956 KB Output is correct
12 Correct 19 ms 6152 KB Output is correct
13 Correct 24 ms 6656 KB Output is correct
14 Correct 19 ms 5956 KB Output is correct
15 Correct 6 ms 2908 KB Output is correct
16 Correct 6 ms 2908 KB Output is correct
17 Correct 15 ms 3572 KB Output is correct
18 Correct 26 ms 6400 KB Output is correct
19 Correct 15 ms 3536 KB Output is correct
20 Correct 16 ms 3620 KB Output is correct
21 Execution timed out 5059 ms 41080 KB Time limit exceeded
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 5 ms 2908 KB Output is correct
4 Correct 5 ms 2908 KB Output is correct
5 Correct 24 ms 6560 KB Output is correct
6 Correct 24 ms 6352 KB Output is correct
7 Correct 10 ms 3260 KB Output is correct
8 Correct 21 ms 6088 KB Output is correct
9 Correct 20 ms 5984 KB Output is correct
10 Correct 24 ms 6616 KB Output is correct
11 Correct 19 ms 5956 KB Output is correct
12 Correct 19 ms 6152 KB Output is correct
13 Correct 24 ms 6656 KB Output is correct
14 Correct 19 ms 5956 KB Output is correct
15 Correct 6 ms 2908 KB Output is correct
16 Correct 6 ms 2908 KB Output is correct
17 Correct 15 ms 3572 KB Output is correct
18 Correct 26 ms 6400 KB Output is correct
19 Correct 15 ms 3536 KB Output is correct
20 Correct 16 ms 3620 KB Output is correct
21 Execution timed out 5059 ms 41080 KB Time limit exceeded
22 Halted 0 ms 0 KB -