Submission #1361507

#TimeUsernameProblemLanguageResultExecution timeMemory
1361507axtelnElection (BOI18_election)C++20
0 / 100
12 ms31556 KiB
#include <bits/stdc++.h>
#define qweqwe cin.tie(0)->sync_with_stdio(0)
using namespace std;
using ll = long long;
using pii = pair<ll,ll>;
using db = long double;

int n;

struct SegTree{
	vector<ll> seg=vector<ll>(2000067,LLONG_MAX);

	void update(int node,int l,int r,ll val,int idx){
		if (l==r){
			seg[node]=val;return;
		}int mid=(l+r)>>1;
		if (idx <= mid)update(2*node,l,mid,val,idx);
		else update(2*node+1,mid+1,r,val,idx);
		seg[node]=min(seg[2*node],seg[2*node+1]);
	}
	
	ll query(int node,int l,int r,int ql,int qr){
		if (ql>r||qr<l) return LLONG_MAX;
		if (l>=ql&&r<=qr) return seg[node];
		int mid=(l+r)>>1;
		ll q1=query(2*node,l,mid,ql,qr);
		ll q2=query(2*node+1,mid+1,r,ql,qr);
		return min(q1,q2);
	}
	
	void update(int val,int idx){update(1,1,n,val,idx);}
	ll query(int l,int r){return query(1,1,n,l,r);}
};

int main(){
	qweqwe;
	SegTree pref,suff;
	cin >> n;
	vector<ll> pf(n+1,0),sf(n+2,0),arr(n+1);
	for (int i=1;i<=n;i++){
		int a;
		char c;cin >> c;
		if(c=='C') a=1;
		else a=-1;
		arr[i]=a;
		pf[i]=pf[i-1]+arr[i];
	}sf[n]=arr[n];
	for (int i=n-1;i>=1;i--){
		sf[i]=sf[i+1]+arr[i];
	}
	for (int i=1;i<=n;i++){
		pref.update(pf[i],i);
		suff.update(sf[i],i);
	}
	/*
	for (int i=1;i<=n;i++){
		cout << pf[i] << " " << sf[i] << '\n';
	}
	*/
	int q;cin >> q;
	for (int i=0;i<q;i++){
		int l,r;cin >> l >> r;
		/*
		for (int j=l-1;j<=r;j++){
			cout << arr[j] << " ";
		}cout << "\n";
		for (int j=l-1;j<=r;j++){
			cout << pf[j] << " ";
		}cout << "\n";
		for (int j=l-1;j<=r;j++){
			cout << sf[j] << " ";
		}cout << "\n";
		*/
		cout << max(pf[l-1]-pref.query(l,r),sf[r+1]-suff.query(l,r)) << "\n";
	}
	return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...