#include <bits/stdc++.h>
#define int long long
#define pii pair<int, int>
#define ff first
#define ss second
const int inf = 3e18;
using namespace std;
using ld = long double;
/*
struct seggy
{
int n;
vector<int> tree;
seggy(int sz)
{
n = sz;
tree.resize(4*n,0);
}
int query(int l,int r,int L,int R,int idx)
{
if (l>R||r<L)return 0ll;
if (l>=L&&r<=R)return tree[idx];
int mid = l+r>>1;
return query(l,mid,L,R,2*idx)+query(mid+1,r,L,R,2*idx+1);
}
int query(int l,int r)
{
return query(0,n-1,l,r,1);
}
void update(int l,int r,int i,int x,int idx)
{
if (l>i||r<i)return;
if(l==r)
{
tree[idx] = x;
return;
}
int mid = l+r>>1;
update(l,mid,i,x,2*idx);
update(mid+1,r,i,x,2*idx+1);
tree[idx] = tree[2*idx]+tree[2*idx+1];
}
void update(int i,int x)
{
update(0,n-1,i,x,1);
}
};
*/
struct lijen
{
int n;
vector<int> tree, lazy;
lijen(int sz)
{
n = sz;
tree.resize(4 * n, 0);
lazy.resize(4 * n, 0);
}
void pass(int l, int r, int idx)
{
if (lazy[idx] == 0)
return;
tree[idx] += lazy[idx];
if (l != r)
{
lazy[2 * idx] += lazy[idx];
lazy[2 * idx + 1] += lazy[idx];
}
lazy[idx] = 0;
}
int query(int l, int r, int L, int R, int idx)
{
pass(l, r, idx);
if (l > R || r < L)
return inf;
if (l >= L && r <= R)
return tree[idx];
int mid = l + r >> 1;
return min(query(l, mid, L, R, 2 * idx), query(mid + 1, r, L, R, 2 * idx + 1));
}
int query(int l, int r)
{
return query(0, n - 1, l, r, 1);
}
void update(int l, int r, int L, int R, int x, int idx)
{
pass(l, r, idx);
if (l > R || r < L)
return;
if (l >= L && r <= R)
{
lazy[idx] += x;
pass(l, r, idx);
return;
}
int mid = l + r >> 1;
update(l, mid, L, R, x, 2 * idx);
update(mid + 1, r, L, R, x, 2 * idx + 1);
tree[idx] = min(tree[2 * idx], tree[2 * idx + 1]);
}
void update(int l, int r, int x)
{
update(0, n - 1, l, r, x, 1);
}
};
void solve()
{
int n;
cin >> n;
string s;
cin >> s;
vector<int> v(n, -1);
for (int i = 0; i < n; i++)
if (s[i] == 'C')
v[i] += 2;
int q;
cin >> q;
vector<array<int, 3>> quers(q);
for (int i = 0; i < q; i++)
cin >> quers[i][0] >> quers[i][1], quers[i][2] = i;
sort(quers.begin(), quers.end());
vector<int> ans(q);
for (auto &a : quers)
a[0]--, a[1]--;
vector<int> pref(n), suf(n);
pref[0] = v[0];
for (int i = 1; i < n; i++)
pref[i] = v[i] + pref[i - 1];
suf[n - 1] = v[n - 1];
for (int i = n - 2; i >= 0; i--)
suf[i] = suf[i + 1] + v[i];
lijen mile(n), nane(n);
for (int i = 0; i < n; i++)
mile.update(i, i, suf[i]), nane.update(i, i, pref[i]);
map<int, int> idx;
map<int, vector<int>> idxs;
for (int i = 0; i < n; i++)
idxs[pref[i]].push_back(i);
for (int i = -n; i <= n; i++)
idxs[i].push_back(n-1);
for (int i = -1; i >= -n; i--)
if (idxs[i].size() > 1)
mile.update(0, idxs[i][0], 1);
int sum = 0;
int j = 0;
auto print = [&]()
{
for (int i = 0; i < n; i++)
{
cout << mile.query(i, i) << ' ';
}
cout << '\n';
for (int i = 0; i < n; i++)
cout << nane.query(i, i) << ' ';
cout << "\n\n";
};
for (int i = 0; i < n; i++)
{
//print();
while (j < q && quers[j][0] == i)
{
int l = quers[j][0], r = quers[j][1];
ans[quers[j][2]] = max(0ll, -(nane.query(l, r) - (l > 0 ? pref[l - 1] : 0))) +
max(0ll, -(mile.query(l, r) - (r < n - 1 ? mile.query(r + 1, r + 1) : 0)));
j++;
}
if (pref[i] < sum)
{
int p = idx[pref[i]];
mile.update(idxs[pref[i]][p]+1, idxs[pref[i]][p + 1], 1);
}
idx[pref[i]]++;
if (idx[sum] < idxs[sum].size() - 1)
{
int val = idxs[sum][idx[sum]];
if (v[i] < 0)
mile.update(0, val, -1);
else
mile.update(0, val, 1);
}
sum += v[i];
}
for (int x : ans)
cout << x << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
int t = 1;
// cin >> t;
while (t--)
solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |