Submission #1232830

#TimeUsernameProblemLanguageResultExecution timeMemory
1232830AdnanboiElection (BOI18_election)C++20
0 / 100
1 ms576 KiB
#include <bits/stdc++.h>

using namespace std;

const int MOD = 1e9 + 7;

void solve(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    vector<int> p(n + 1, 0);
    for(int i = 1; i <= n; i++){
        p[i] = p[i - 1] + (s[i - 1] == 'C' ? 1 : -1);
    }
    int logn = 1;
    while((1 << logn) <= n + 1) logn++;
    vector<int> lg(n + 2);
    lg[1] = 0;
    for(int i = 2; i <= n + 1; i++) lg[i] = lg[i / 2] + 1;
    vector<vector<int> > stmin(logn, vector<int>(n + 1));
    vector<vector<int> > stmax(logn, vector<int>(n + 1));
    for(int i = 0; i <= n; i++){
        stmin[0][i] = p[i];
        stmax[0][i] = p[i];
    }
    for(int k = 1;k < logn; k++){
        for(int i = 0; i + (1 << k) <= n + 1; i++){
            stmin[k][i] = min(stmin[k - 1][i], stmin[k - 1][i + (1 << (k - 1))]);
            stmax[k][i] = max(stmax[k - 1][i], stmax[k - 1][i + (1 << (k - 1))]);
        }
    }
    auto get_min = [&](int l, int r){
        int k = lg[r - l + 1];
        return min(stmin[k][l], stmin[k][r - (1 << k) + 1]);
    };
    auto get_max = [&](int l, int r){
        int k = lg[r - l + 1];
        return max(stmax[k][l], stmax[k][r - (1 << k) + 1]);
    };
    int q;
    cin>>q;
    while(q--){
        int l, r;
        cin>>l>>r;
        int min_pref = get_min(l, r);
        int need1 = max(0, p[l - 1] - min_pref);
        int max_pref = get_max(l - 1, r - 1);
        int need2 = max(0, max_pref - p[r]);
        cout<<max(need1, need2)<<'\n';
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int t = 1;
    //cin>>t;
    while(t--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...