Submission #1340691

#TimeUsernameProblemLanguageResultExecution timeMemory
1340691soimi0804Election (BOI18_election)C++20
0 / 100
3 ms344 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 5e5+5;
int n,q,v1[MAXN],v2[MAXN];

struct segm{

    vector<int> tree;

    void init(int n,int v[]){
        tree.assign(4*n,-1e9);
        build(1,1,n,v);
    }

    void build(int node,int l,int r,int v[]){
        if(l == r){
            tree[node] = v[l];
            return;
        }
        int mid = (l+r)/2;
        build(2*node,l,mid,v);
        build(2*node+1,mid+1,r,v);
        tree[node] = max(tree[2*node],tree[2*node+1]);
    }

    int query(int node,int l,int r,int ql,int qr){

        if(r<ql || qr < l)return -1e9;
        if(ql <= l && r<= qr){
            return tree[node];
        }
        int mid = (l+r)/2;
        return max(query(2*node,l,mid,ql,qr),query(2*node+1,mid+1,r,ql,qr));
    }
};

int main()
{

    cin >> n;
    string s;
    cin >> s;
    for(int i = 1;i<=n;i++){
        v1[i] = v1[i-1]+((s[i-1]=='C')?-1:1);
    }
    for(int i = n;i>=1;i--){
        v2[i] = v2[i+1]+((s[i-1]=='C')?-1:1);
    }

    segm ps,ss;
    ps.init(n,v1);
    ss.init(n,v2);

    cin >> q;
    while(q--){
        int l,r;
        cin >> l >> r;
        int ans1 = ps.query(1,1,n,l,r)-v1[l-1];
        int ans2 = ss.query(1,1,n,l,r)-v2[r+1];
        cout << max(ans1,ans2) << '\n';
    }

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