dan_sml

Untitled

Jul 16th, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int maxn = 1e5 + 7;
  6. const pair <int, int> NEUTRAL = {0, 0};
  7. pair <int, int> t[4 * maxn];
  8. int a[maxn];
  9.  
  10. pair <int, int> f(pair <int, int> a, pair <int, int> b) {
  11.     if (a.first == b.first) {
  12.         return {a.first, a.second + b.second};
  13.     }
  14.     return max(a, b);
  15. }
  16.  
  17. void build(int v, int l, int r) {
  18.     if (r - l == 1) {
  19.         t[v] = {a[l], 1};
  20.         return;
  21.     }
  22.     int m = (l + r) / 2;
  23.     build(2 * v + 1, l, m);
  24.     build(2 * v + 2, m, r);
  25.     t[v] = f(t[2 * v + 1], t[2 * v + 2]);
  26. }
  27.  
  28. pair <int, int> ask(int v, int l, int r, int askl, int askr) {
  29.     if (askr <= l || r <= askl) {
  30.         return NEUTRAL;
  31.     }
  32.     if (askl <= l && r <= askr) {
  33.         return t[v];
  34.     }
  35.     int m = (l + r) / 2;
  36.     return f(ask(2 * v + 1, l, m, askl, askr), ask(2 * v + 2, m, r, askl, askr));
  37. }
  38.  
  39. void change(int v, int l, int r, int pos, int val) {
  40.     if (r - l == 1) {
  41.         t[v] = {val, 1};
  42.         return;
  43.     }
  44.     int m = (l + r) / 2;
  45.     if (pos < m) change(2 * v + 1, l, m, pos, val);
  46.     else change(2 * v + 2, m, r, pos, val);
  47.     t[v] = f(t[2 * v + 1], t[2 * v + 2]);
  48.     return;
  49. }
  50.  
  51. signed main() {
  52.     ios::sync_with_stdio(0);
  53.     cin.tie(0);
  54.     int n;
  55.     cin >> n;
  56.     for (int i = 0; i < n; i++) cin >> a[i];
  57.     build(0, 0, n);
  58.     int q;
  59.     cin >> q;
  60.     for (int _ = 0; _ < q; _++) {
  61.         char type;
  62.         cin >> type;
  63.         if (type == 's') {
  64.             int l, r;
  65.             cin >> l >> r;
  66.             auto ans = ask(0, 0, n, l - 1, r);
  67.             cout << ans.second << " ";
  68.         }
  69.         else {
  70.             int pos, val;
  71.             cin >> pos >> val;
  72.             change(0, 0, n, pos - 1, val);
  73.         }
  74.     }
  75. }
Advertisement
Add Comment
Please, Sign In to add comment