Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 1e5 + 7;
- const pair <int, int> NEUTRAL = {0, 0};
- pair <int, int> t[4 * maxn];
- int a[maxn];
- pair <int, int> f(pair <int, int> a, pair <int, int> b) {
- if (a.first == b.first) {
- return {a.first, a.second + b.second};
- }
- return max(a, b);
- }
- void build(int v, int l, int r) {
- if (r - l == 1) {
- t[v] = {a[l], 1};
- return;
- }
- int m = (l + r) / 2;
- build(2 * v + 1, l, m);
- build(2 * v + 2, m, r);
- t[v] = f(t[2 * v + 1], t[2 * v + 2]);
- }
- pair <int, int> ask(int v, int l, int r, int askl, int askr) {
- if (askr <= l || r <= askl) {
- return NEUTRAL;
- }
- if (askl <= l && r <= askr) {
- return t[v];
- }
- int m = (l + r) / 2;
- return f(ask(2 * v + 1, l, m, askl, askr), ask(2 * v + 2, m, r, askl, askr));
- }
- void change(int v, int l, int r, int pos, int val) {
- if (r - l == 1) {
- t[v] = {val, 1};
- return;
- }
- int m = (l + r) / 2;
- if (pos < m) change(2 * v + 1, l, m, pos, val);
- else change(2 * v + 2, m, r, pos, val);
- t[v] = f(t[2 * v + 1], t[2 * v + 2]);
- return;
- }
- signed main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- int n;
- cin >> n;
- for (int i = 0; i < n; i++) cin >> a[i];
- build(0, 0, n);
- int q;
- cin >> q;
- for (int _ = 0; _ < q; _++) {
- char type;
- cin >> type;
- if (type == 's') {
- int l, r;
- cin >> l >> r;
- auto ans = ask(0, 0, n, l - 1, r);
- cout << ans.second << " ";
- }
- else {
- int pos, val;
- cin >> pos >> val;
- change(0, 0, n, pos - 1, val);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment