Submission #1357530

#TimeUsernameProblemLanguageResultExecution timeMemory
1357530iamhereforfunElection (BOI18_election)C++20
100 / 100
301 ms67116 KiB
// Starcraft 2 enjoyer //

#include <bits/stdc++.h>

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")

using namespace std;

#define LSOne(X) ((X) & -(X))
#define int long long

const int N = 5e5 + 5;
const int M = 2e6 + 5;
const long long K = 2;
const int LG = 60;
const long long INF = 1e18 + 5;
const int C = 26;
const int B = 1000;
const int MOD = 998244353;

struct Node
{
    int sum, pref, suff, mx;
    Node operator+(const Node &a)
    {
        Node ans;
        ans.sum = sum + a.sum;
        ans.pref = max(pref, a.pref + sum);
        ans.suff = max(suff + a.sum, a.suff);
        ans.mx = max({pref + a.suff, sum + a.mx, mx + a.sum});
        return ans;
    }
    void print()
    {
        cout << sum << " " << pref << " " << suff << " " << mx << "\n";
    }
};

struct SegmentTree
{
    vector<Node> st;
    string s;
    int n;
    void build(int v, int l, int r)
    {
        if (l == r)
        {
            st[v].sum = s[l] == 'C' ? -1 : 1;
            st[v].pref = st[v].suff = st[v].mx = s[l] == 'C' ? 0 : 1;
        }
        else
        {
            int m = (l + r) / 2;
            build(2 * v, l, m);
            build(2 * v + 1, m + 1, r);
            st[v] = st[2 * v] + st[2 * v + 1];
        }
        // cout << l << " " << r << "\n";
        // st[v].print();
    }
    Node get(int v, int l, int r, int tl, int tr)
    {
        if (tl > tr)
            return {0, -INF, -INF, -INF};
        if (tl <= l && r <= tr)
        {
            return st[v];
        }
        else
        {
            int m = (l + r) / 2;
            return get(2 * v, l, m, tl, min(tr, m)) + get(2 * v + 1, m + 1, r, max(tl, m + 1), tr);
        }
    }
    SegmentTree(int len)
    {
        n = len;
        st.assign(4 * n, {});
    }
    void build(string t)
    {
        s = t;
        build(1, 0, n - 1);
    }
    int get(int l, int r)
    {
        return get(1, 0, n - 1, l, r).mx;
    }
};

int n, q;
string s;

inline void solve()
{
    cin >> n >> s >> q;
    SegmentTree st(n);
    st.build(s);
    for(int x = 0; x < q; x++)
    {
        int l, r; cin >> l >> r;
        l--;
        r--;
        cout << st.get(l, r) << "\n";
    }
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    for (int x = 1; x <= t; x++)
    {
        solve();
    }
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...