Submission #1346025

#TimeUsernameProblemLanguageResultExecution timeMemory
1346025primovocatusElection (BOI18_election)C++20
100 / 100
274 ms21696 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 5e5 + 5;

int a[N];

struct {
    struct node {
        int pref, suff, sum, ans;

        void merge(node& l, node& r) {
            pref = max(l.pref, l.sum + r.pref);
            suff = max(r.suff, r.sum + l.suff);
            sum = l.sum + r.sum;
            ans = max({l.ans + r.sum, l.sum + r.ans, l.pref + r.suff});
        }
    };

    node t[4 * N];

    void build(int v, int tl, int tr) {
        if (tl == tr) {
            if (a[tl] == 1) {
                t[v].pref = t[v].suff = 1;
                t[v].sum = 1, t[v].ans = 1;
            } else {
                t[v].pref = t[v].suff = 0;
                t[v].sum = -1, t[v].ans = 0;
            }
            return;
        }

        int tm = (tl + tr) >> 1;
    
        build(v << 1, tl, tm);
        build(v << 1 | 1, tm + 1, tr);

        t[v].merge(t[v << 1], t[v << 1 | 1]);
    }
    node get(int v, int tl, int tr, int l, int r) {
        if (l > r) return {0, 0, 0, 0};

        if (tl == l && tr == r) {
            return t[v];
        }

        int tm = (tl + tr) >> 1;

        node g1 = get(v << 1, tl, tm, l, min(tm, r));
        node g2 = get(v << 1 | 1, tm + 1, tr, max(tm + 1, l), r);

        node ans; ans.merge(g1, g2);
        return ans;
    }
} T;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    
    int n;
    cin >> n;

    for (int i = 1; i <= n; ++i) {
        char c; cin >> c;
        a[i] = (c == 'T' ? 1 : -1);
    }

    int q;
    cin >> q;

    T.build(1, 1, n);
    for (int i = 0; i < q; ++i) {
        int l, r;
        cin >> l >> r;

        cout << T.get(1, 1, n, l, r).ans << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...