Submission #1131046

#TimeUsernameProblemLanguageResultExecution timeMemory
1131046A_M_NamdarElection (BOI18_election)C++20
100 / 100
617 ms70956 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 5e5 + 10;
int n, q, a[N], sum[N], ans[N];
vector<int> pos[N + N];
vector<pair<int, int>> vec[N];
struct node {
        int maxi, lazy;
} seg[N << 2];

void build(int l, int r, int id) {
        if (r - l == 1) {
                seg[id].maxi = sum[l];
                return;
        }
        int mid = (l + r) / 2;
        build(l, mid, id << 1), build(mid, r, id << 1 | 1);
        seg[id].maxi = max(seg[id << 1].maxi, seg[id << 1 | 1].maxi);
}

void shift(int id) {
        seg[id << 1].lazy += seg[id].lazy, seg[id << 1 | 1].lazy += seg[id].lazy;
        seg[id << 1].maxi += seg[id].lazy, seg[id << 1 | 1].maxi += seg[id].lazy;
        seg[id].lazy = 0;
}

void add(int l1, int r1, int l2, int r2, int v, int id) {
        if (l1 >= r2 || r1 <= l2) return;
        if (l1 >= l2 && r1 <= r2) {
                seg[id].lazy += v, seg[id].maxi += v;
                return;
        }
        shift(id);
        int mid = (l1 + r1) / 2;
        add(l1, mid, l2, r2, v, id << 1), add(mid, r1, l2, r2, v, id << 1 | 1);
        seg[id].maxi = max(seg[id << 1].maxi, seg[id << 1 | 1].maxi);
}

int get(int l, int r, int ind, int id) {
        if (l > ind || r <= ind) return 0;
        if (r - l == 1) return seg[id].lazy;
        shift(id);
        int mid = (l + r) / 2;
        return get(l, mid, ind, id << 1) + get(mid, r, ind, id << 1 | 1);
}

int get_max(int l1, int r1, int l2, int r2, int id) {
        if (l1 >= r2 || r1 <= l2) return -1e9;
        if (l1 >= l2 && r1 <= r2) return seg[id].maxi;
        shift(id);
        int mid = (l1 + r1) / 2;
        return max(get_max(l1, mid, l2, r2, id << 1), get_max(mid, r1, l2, r2, id << 1 | 1));
}

void input() {
        cin >> n;
        for (int i = 0; i < n; i++) {
                char c;
                cin >> c;
                a[i] = (c == 'C') - (c != 'C');
                sum[i] = (i? sum[i - 1]: 0) + a[i];
                pos[sum[i] + N].push_back(i);
        }
        cin >> q;
        for (int i = 0; i < q; i++) {
                int l, r;
                cin >> l >> r;
                vec[l - 1].push_back({r, i});
        }
}

void solve() {
        build(0, n, 1);
        for (int i = n - 1; i >= 0; i--) {
                if (a[i] == 1) {
                        int x = (i? sum[i - 1]: 0);
                        int tmp = upper_bound(pos[x + N].begin(), pos[x + N].end(), i) - pos[x + N].begin();
                        if (tmp < (int)pos[x + N].size()) {
                                add(0, n, pos[x + N][tmp], n, -1, 1);
//                              cout << pos[x + N][tmp] << ' ' << n << ' ' << -1 << '\n';
                        }
                }
                else {
                        add(0, n, i, n, 1, 1);
//                      cout << i << ' ' << n << ' ' << 1 << '\n';
                }

                for (pair<int, int> tmp: vec[i]) {
//                      ans[tmp.second] = get(0, n, tmp.first - 1, 1) + max(0, get_max(0, n, i, tmp.first, 1) - sum[tmp.first - 1] - get(0, n, tmp.first - 1, 1));
                        ans[tmp.second] = get_max(0, n, i, tmp.first, 1) - sum[tmp.first - 1];
//                      cout <<  get_max(0, n, i, tmp.first, 1) << ' ' << sum[tmp.first - 1] << '\n';
                }
        }
}

void output() {
        for (int i = 0; i < q; i++) {
                cout << ans[i];
                if (i + 1 < q) cout << '\n';
        }
}

int main() {
        ios:: sync_with_stdio(0), cin.tie(0), cout.tie(0);
        input();
        solve();
        output();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...