Submission #1153849

#TimeUsernameProblemLanguageResultExecution timeMemory
1153849byunjaewooElection (BOI18_election)C++20
0 / 100
13 ms16960 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=500010, S=(1<<19);
int n, q, a[N];
string s;

template<bool op>
class seg {
public:
    void init() {init(1, 0, S-1);}
    pair<int, int> query(int l, int r) {return query(1, 0, S-1, l, r);}
private:
    pair<int, int> tree[2*S];
    void init(int node, int s, int e) {
        if(s==e) {
            if(s<=n) tree[node]={a[s], -s};
            return;
        }
        int lch=2*node, rch=lch+1, m=(s+e)/2;
        init(lch, s, m), init(rch, m+1, e);
        if(op) tree[node]=min(tree[lch], tree[rch]);
        else tree[node]=max(tree[lch], tree[rch]);
    }
    pair<int, int> 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);
        if(op) return min(query(lch, s, m, l, r), query(rch, m+1, e, l, r));
        else return max(query(lch, s, m, l, r), query(rch, m+1, e, l, r));
    }
};
seg<0> Tmx; seg<1> Tmn;

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n>>s;
    for(int i=1; i<=n; i++) a[i]=a[i-1]+((s[i-1]=='C')?1:-1);
    Tmx.init(), Tmn.init();
    cin>>q;
    while(q--) {
        int l, r; cin>>l>>r;
        pair<int, int> mx=Tmx.query(l-1, r), mn=Tmn.query(l-1, r);
        if(-mx.second<-mn.second) cout<<max(mx.first-a[r], a[l-1]-mn.first)<<"\n";
        else cout<<mx.first-a[r]+a[l-1]-mn.first<<"\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...