Submission #1281476

#TimeUsernameProblemLanguageResultExecution timeMemory
1281476dora_kyuElection (BOI18_election)C++20
0 / 100
1 ms332 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define st first
#define nd second
#define endl "\n"
const int maxn = 5e5 + 5;
int pre[maxn], suf[maxn];
const int inf = 1e9 + 5;
string s;
int n, q;

pair<int,int> nod[maxn << 4];

void build(int id, int l, int r)
{
    if( l == r )
    {
        nod[id] = {pre[l], suf[l]}; return;
    }
    int m = l + r >> 1;
    build(id << 1, l , m);
    build(id << 1 | 1, m + 1, r);
    nod[id] = { min(nod[id << 1].st , nod[id << 1 | 1].st), min(nod[id << 1].nd , nod[id << 1 | 1].nd) };
}

pair<int,int> get(int id, int l, int r, int u, int v)
{
    if(l > v || r < u) return {inf,inf};
    if(l >= u && r <= v) return nod[id];
    int m = l + r >> 1;
    pair<int,int> p1 = get(id << 1, l , m , u , v);
    pair<int,int> p2 = get(id << 1 | 1, m + 1 , r, u , v);
    return { min(p1.st, p2.st), min(p1.nd, p2.nd) };
}

signed main()
{
    cin.tie(nullptr) -> ios_base::sync_with_stdio(0);
    cin >> n >> s;
    s = " " + s;
    for(int i = 1; i <= n;++i)
    {
        pre[i] = pre[i-1] + (s[i] == 'T' ? -1 : 1);
        suf[n - i + 1] = suf[n - i + 2] + (s[n-i+1] == 'T' ? -1 : 1);
    }
    build(1,1,n);
    cin >> q;

    for(int i = 1; i <= q; ++i)
    {
        int l, r; cin >> l >> r;
        pair<int,int> R = get(1,1,n,l,r);
        cout << abs( min( min(0,R.st - pre[l-1]), min(0, R.nd - suf[r + 1]) ) ) << endl;
    }

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