Submission #1083143

#TimeUsernameProblemLanguageResultExecution timeMemory
1083143BLOBVISGODElection (BOI18_election)C++17
100 / 100
296 ms30020 KiB
#include "bits/stdc++.h"
using namespace std;
#define rep(i,a,b) for(int i=(a); i<(b); ++i)
#define all(x) x.begin(),x.end()
#define sz(x) int(x.size())
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;

struct segtree{
    struct node{
        int sm=0, L=0, R=0, A=0;
        node operator+(node b){
            return node{sm+b.sm,
                max(L,sm+b.L),
                max(b.R,b.sm+R),
                max(max(sm+b.A,A+b.sm),L+b.R)};
        }
    };

    int n;
    vector<node> seg;
    segtree(vi a){
        n = 1;
        while(n<sz(a)) 
            n*=2;
        seg.resize(n*2);
        rep(i,0,sz(a)) seg[i+n] = {a[i],max(0,a[i]),max(0,a[i]),max(0,a[i])};
        for(int i = n-1; i>0; --i) seg[i] = seg[i*2]+seg[i*2+1];
    }

    node query(int id, int l, int r, int ql, int qr){
        if (r <= ql or l >= qr) return {};
        else if (l >= ql and r <= qr) return seg[id];
        else{
            int mid = (l+r)/2;
            return query(id*2,l,mid,ql,qr)+query(id*2+1,mid,r,ql,qr);
        }
    }
};

int main(){
    cin.tie(NULL),cin.sync_with_stdio(false);
    
    int n; cin >> n;
    vi a(n);
    string s; cin >> s;
    rep(i,0,n){
        a[i] = (s[i]=='T'?1:-1);
    }

    segtree seg(a);

    int q; cin >> q;
    while(q--){
        int l,r; cin >> l >> r;
        l--;
        auto ret = seg.query(1,0,seg.n,l,r);
        cout << ret.A << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...