Submission #234853

#TimeUsernameProblemLanguageResultExecution timeMemory
234853mahmoudbadawyElection (BOI18_election)C++17
100 / 100
1282 ms44072 KiB
#include <bits/stdc++.h>

using namespace std;

const int N=5e5+5;

int btree[4*N],lazy[4*N];
string s;
int n,q;
vector<pair<int,int> > qs[N];
int ans[N];

void prob(int node,int l,int r)
{
	btree[node]+=lazy[node];
	if(l!=r)
	{
		lazy[node<<1]+=lazy[node];
		lazy[(node<<1)|1]+=lazy[node];
	}
	lazy[node]=0;
}

void update(int node,int l,int r,int ql,int qr,int v)
{
	if(lazy[node]) prob(node,l,r);
	if(r<ql||qr<l) return;
	if(ql<=l&&r<=qr)
	{
		lazy[node]+=v;
		prob(node,l,r);
		return;
	}
	int mid=(l+r)>>1;
	update(node<<1,l,mid,ql,qr,v);
	update((node<<1)|1,mid+1,r,ql,qr,v);
	btree[node]=max(btree[node<<1],btree[(node<<1)|1]);
}

int query(int node,int l,int r,int ql,int qr)
{
	if(lazy[node]) prob(node,l,r);
	if(r<ql||qr<l) return -(1<<30);
	if(ql<=l&&r<=qr) return btree[node];
	int mid=(l+r)>>1;
	return max(query(node<<1,l,mid,ql,qr),query((node<<1)|1,mid+1,r,ql,qr));
}

int main()
{
	cin >> n >> s >> q;
	for(int i=0;i<q;i++)
	{
		int l,r;
		cin >> l >> r;
		l--; r--;
		qs[r].push_back({l,i});
	}
	vector<int> qp;
	for(int i=0;i<n;i++)
	{
		if(s[i]=='T')
		{
			qp.push_back(i);
		}
		else
		{
			if(qp.size())
			{
				update(1,0,n-1,qp.back(),n,1);
				qp.pop_back();
			}
			update(1,0,n-1,i,n,-1);
		}
		for(auto j:qs[i])
		{
			int l=j.first;
			int x=lower_bound(qp.begin(),qp.end(),l)-qp.begin();
			ans[j.second]=(qp.size()-x)+max(query(1,0,n-1,l,i)-(l?query(1,0,n-1,l-1,l-1):0),0);
		}
	}
	for(int i=0;i<q;i++)
		printf("%d\n",ans[i]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...