제출 #1337104

#제출 시각아이디문제언어결과실행 시간메모리
1337104joacruTornjevi (COCI25_tornjevi)C++20
110 / 110
50 ms6248 KiB
#include <iostream>
#include <algorithm>
#include <vector>

#define forn(i,n) for(int i=0;i<(int)n;++i)

#define DBG(a) cerr<<#a<<" = "<<(a)<<endl
#define DBGA(a) cerr<<#a<<" = "<<(a)<<", ";
#define DBG2(a,b) do{DBGA(a)DBG(b);}while(0)

#define ALL(v) v.begin(),v.end()
#define SZ(v) (int)v.size()

using namespace std;

template<typename T>
ostream &operator<<(ostream &os, vector<T> v){
	os<<"[";
	forn(i,SZ(v)){
		if(i) os<<", ";
		os<<v[i];
	}
	os<<"]";
	return os;
}

struct Node{
	int P = 0; // cantidad de P - C al final
	int maxP = 0; // maxima diferencia de P en algún momento
	int maxC = 0; // maxima diferencia de C en algún momento
	int L = 0, R = 0; // L <= R, rango en el que se mueve. respueta es R-L
};

ostream &operator<<(ostream &os, Node &u){
	os<<"("<<u.P<<","<<u.maxP<<","<<u.maxC<<","<<u.L<<","<<u.R<<")";
	return os;
}

struct ST{
	int n;
	vector<Node> st;
	ST(const string &s){
		int m = SZ(s);
		n = 1<<(32-__builtin_clz(m-1));
		st.resize(2*n-1);
		for(int i=n-1,j=0;j<m;++i,++j){
			if(s[j] == 'P') st[i] = {1,1,-1,0,1};
			else st[i] = {-1,-1,1,-1,1};
		}
		for(int i=n-2;i>=0;--i) st[i] = merge(st[2*i+2],st[2*i+1]);
	}
	Node merge(const Node &a, const Node &b){
		Node ret;
		ret.P = a.P + b.P;
		ret.R = a.R;
		ret.R = max(ret.R, a.P + b.maxP);
		ret.L = a.L;
		ret.L = min(ret.L, a.P - b.maxC);
		ret.maxP = a.maxP;
		ret.maxC = a.maxC;
		ret.maxP = max(ret.maxP, a.P + b.maxP); // cual fue el subidon mas grande de P
		ret.maxC = max(ret.maxC, -a.P + b.maxC); // puede ser negativo
		return ret;
	}
	Node query(int ql, int qr, int l, int r, int i){
		if(l>=qr||r<=ql) return Node();
		if(l>=ql&&r<=qr){
			//~ DBG2(i, st[i]);
			return st[i];
		}
		int m=(l+r)/2;
		return merge(query(ql,qr,m,r,2*i+2),query(ql,qr,l,m,2*i+1));
	}
	int query(int l, int r){
		Node aux = query(l,r,0,n,0);
		//~ DBG(aux);
		return aux.R-aux.L;
	}
};

void solve(){
	
	int n, q;	
	string s;
	cin>>n>>q>>s;
	ST blocks(s);
	//~ DBG(blocks.st);
	while(q--){
		int l,r;
		cin>>l>>r;
		l--;
		//~ DBG2(l,r);
		cout<<blocks.query(l,r)<<"\n";
	}
}

int main(){
	
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	#ifdef LOCAL
	freopen("E.in", "r", stdin);
	int tcs; cin>>tcs;
	while(tcs--)
	#endif
	solve();
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...