Submission #1268449

#TimeUsernameProblemLanguageResultExecution timeMemory
1268449denislavElection (BOI18_election)C++20
100 / 100
531 ms20168 KiB
# include <iostream>
using namespace std;

const int MAX=5e5+11;

int n,q;
char a[MAX];

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

    node friend operator + (node A, node B)
    {
        if(A.ans==-1) return B;
        if(B.ans==-1) return A;

        node res;
        res.sum=A.sum+B.sum;
        res.pref=max(A.pref,A.sum+B.pref);
        res.suf=max(B.suf,A.suf+B.sum);
        res.ans=max(max(A.ans+B.sum,A.sum+B.ans),A.pref+B.suf);
        return res;
    }
};

node tree[MAX*4];

void build(int v=1, int l=1, int r=n)
{
    if(l==r)
    {
        if(a[l]=='C') tree[v]={-1,0,0,0};
        else tree[v]={1,1,1,1};
        return ;
    }

    int mid=(l+r)/2;
    build(v*2,l,mid);
    build(v*2+1,mid+1,r);
    tree[v]=tree[v*2]+tree[v*2+1];
}

node query(int le, int ri, int v=1, int l=1, int r=n)
{
    if(ri<l or r<le) return {-1,-1,-1,-1};
    if(le<=l and r<=ri) return tree[v];

    int mid=(l+r)/2;
    return query(le,ri,v*2,l,mid)+query(le,ri,v*2+1,mid+1,r);
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    build();

    cin>>q;
    while(q--)
    {
        int l,r;
        cin>>l>>r;
        cout<<query(l,r).ans<<"\n";
    }

    return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...