Submission #1154129

#TimeUsernameProblemLanguageResultExecution timeMemory
1154129byunjaewooElection (BOI18_election)C++20
100 / 100
316 ms36692 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=500010;
int n, q;
string t;

class seg {
public:
    void init() {init(1, 1, n);}
    int query(int l, int r) {return query(1, 1, n, l, r).v;}
private:
    struct Data {int l, r, s, v;};
    Data tree[4*N];
    Data Merge(Data a, Data b) {
        Data ret;
        ret.l=max(a.l, -a.s+b.l);
        ret.r=max(b.r, a.r-b.s);
        ret.s=a.s+b.s;
        ret.v=max({a.v-b.s, b.v-a.s, a.l+b.r});
        return ret;
    }
    void init(int node, int s, int e) {
        if(s==e) {
            if(t[s-1]=='C') tree[node]={0, 0, 1, 0};
            else tree[node]={1, 1, -1, 1};
            return;
        }
        int lch=2*node, rch=lch+1, m=(s+e)/2;
        init(lch, s, m), init(rch, m+1, e);
        tree[node]=Merge(tree[lch], tree[rch]);
    }
    Data query(int node, int s, int e, int l, int r) {
        if(l<=s && e<=r) return tree[node];
        int lch=2*node, rch=lch+1, m=(s+e)/2;
        if(r<=m) return query(lch, s, m, l, r);
        if(l>m) return query(rch, m+1, e, l, r);
        return Merge(query(lch, s, m, l, r), query(rch, m+1, e, l, r));
    }
}T;

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n>>t;
    T.init();
    cin>>q;
    while(q--) {
        int l, r; cin>>l>>r;
        cout<<T.query(l, r)<<"\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...