Advertisement
Guest User

Untitled

a guest
Jan 19th, 2020
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. const int N = 100001;
  6.  
  7. int a[N];
  8. int t[4 * N];
  9.  
  10. void build(int v, int l, int r) {
  11.     if (l == r) {
  12.         t[v] = !a[l];
  13.         return;
  14.     }
  15.     int m = (r + l) / 2;
  16.     build(2 * v, l, m);
  17.     build(2 * v + 1, m + 1, r);
  18.     t[v] = t[2 * v] + t[2 * v + 1];
  19. }
  20.  
  21. void update(int v, int l, int r, int pos, int x) {
  22.     if (l == r) {
  23.         t[v] = !x;
  24.         return;
  25.     }
  26.     int m = (r + l) / 2;
  27.     if (pos <= m) {
  28.         update(2 * v, l, m, pos, x);
  29.     }
  30.     else {
  31.         update(2 * v + 1, m + 1, r, pos, x);
  32.     }
  33.     t[v] = t[2 * v] + t[2 * v + 1];
  34. }
  35.  
  36. int get_kth(int v, int l, int r, int k) {
  37.     if (k > t[v]) {
  38.         return -1;
  39.     }
  40.     if (l == r) {
  41.         return l;
  42.     }
  43.     int m = (r + l) / 2;
  44.     if (t[2 * v] >= k) {
  45.         return get_kth(2 * v, l, m, k);
  46.     }
  47.     else {
  48.         return get_kth(2 * v + 1, m + 1, r, k - t[2 * v]);
  49.     }
  50. }
  51.  
  52. int get_sum(int v, int l, int r, int L, int R) {
  53.     if (r <= L || R <= l) {
  54.         return 0;
  55.     }
  56.     if (L == l && r == R) {
  57.         return t[v];
  58.     }
  59.     int m = (r + l) / 2;
  60.     return get_sum(2 * v, l, m, L, R) + get_sum(2 * v + 1, m + 1, r, L, R);
  61. }
  62.  
  63. int main() {
  64.     int n;
  65.     cin >> n;
  66.     for (int i = 1; i <= n; i++) {
  67.         cin >> a[i];
  68.     }
  69.     build(1, 1, n);
  70.     int m;
  71.     cin >> m;
  72.     char c;
  73.     for (int i = 0; i < m; i++) {
  74.         cin >> c;
  75.         if (c == 's') {
  76.             int l, r, k;
  77.             cin >> l >> r >> k;
  78.             int res = get_kth(1, 1, n, k + get_sum(1, 1, n, 1, l - 1));
  79.             cout << (res <= r ? res : -1) << '\n';
  80.         }
  81.         else {
  82.             int pos, x;
  83.             cin >> pos >> x;
  84.             update(1, 1, n, pos, x);
  85.         }
  86.     }
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement