Submission #1303165

#TimeUsernameProblemLanguageResultExecution timeMemory
1303165duckindogElection (BOI18_election)C++20
100 / 100
380 ms36536 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 500'000 + 10;
int n, q;
int a[N];

namespace IT { 
    struct Node { 
        int pref, suff, sum, best;
        Node(int pref = 0, int suff = 0, int sum = 0, int best = 0) : pref(pref), suff(suff), sum(sum), best(best) {}
    };

    Node merge(const Node& lt, const Node& rt) { 
        return Node(max(lt.pref, lt.sum + rt.pref), max(rt.suff, rt.sum + lt.suff), lt.sum + rt.sum, max({lt.best + rt.sum, lt.sum + rt.best, lt.pref + rt.suff}));
    }

    Node f[N << 2];
    void build(int s, int l, int r) { 
        if (l == r) { 
            if (a[l] == 1) f[s] = Node(0, 0, -1, 0);
            else f[s] = Node(1, 1, 1, 1);
            return;
        }
        int mid = (l + r) >> 1;
        build(s << 1, l, mid);
        build(s << 1 | 1, mid + 1, r);
        f[s] = merge(f[s << 1], f[s << 1 | 1]);
    }
    Node query(int s, int l, int r, int u, int v) { 
        if (v < l || u > r) return Node();
        if (u <= l && r <= v) return f[s];
        int mid = (l + r) >> 1;
        return merge(query(s << 1, l, mid, u, v), query(s << 1 | 1, mid + 1, r, u, v));
    }
}

int32_t main() { 
    cin.tie(0)->sync_with_stdio(0);

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

    IT::build(1, 1, n);

    cin >> q;
    while (q--) { 
        int l, r; cin >> l >> r;
        cout << IT::query(1, 1, n, l, r).best << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...