Submission #1349136

#TimeUsernameProblemLanguageResultExecution timeMemory
1349136Jawad_Akbar_JJCake (CEOI14_cake)C++20
100 / 100
1264 ms55832 KiB
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;
const int N = (1<<20) + 1;
int a[N], vd[N], T, n;

struct sgmt{
	int tm = 0, L, R, bg, tp;
} seg[N<<1], ans, Null;

set<pair<int, int>> Set;
void Add1(sgmt S, int cur = 1, int st = 1, int en = N){
	if (S.L >= en or S.R <= st)
		return;
	if (S.L <= st and S.R >= en){
		seg[cur] = S;
		return;
	}

	int mid = (st + en) / 2;
	Add1(S, cur + cur, st, mid);
	Add1(S, cur+cur+1, mid, en);
}

void get(int i, int cur = 1, int st = 1, int en = N){
	if (i >= en or i < st)
		return;

	if (seg[cur].tm > ans.tm)
		ans = seg[cur];
	if (en - st == 1)
		return;

	int mid = (st + en) / 2;
	get(i, cur + cur, st, mid);
	get(i, cur+cur+1, mid, en);
}

pair<int, int> extend(int l, int r){
	int ind;
	if (a[l] < a[r]){
		if (r == n + 1)
			ind = 0;
		else{
			for (ind=l-1;a[ind] <= a[r];)
				ind--;
		}
		Add1({++T, ind, l+1, r - l, 1});
		l = ind;
	}
	else{
		if (l == 0)
			ind = n + 1;
		else{
			for (ind=r+1;a[ind] <= a[l];)
				ind++;
		}
		Add1({++T, r, ind, r - l, 0});
		r = ind;
	}
	return {l, r};
}
vector<int> vec;

pair<int, int> extend2(int l, int r){
	sort(begin(vec), end(vec));
	int ind;
	if (a[l] < a[r]){
		if (r == n + 1)
			ind = 0;
		else{
			for (int i : vec){
				if (i < l and a[i] > a[r])
					ind = i;
			}
		}
		// if (r)
		Add1({++T, ind, l+1, r - l, 1});
		l = ind;
	}
	else{
		if (l == 0)
			ind = n + 1;
		else{
			for (int i : vec){
				if (i > r and a[i] > a[l]){
					ind = i;
					break;
				}
			}
		}
		Add1({++T, r, ind, r - l, 0});
		r = ind;
	}
	return {l, r};
}

int main(){
	int A, B, q, nxt = 0;
	cin>>n>>A;

	a[0] = n + 1, a[n + 1] = n + 2, nxt = n + 2;
	for (int i=1;i<=n;i++)
		cin>>a[i];

	for (int i=0;i<=n+1;i++)
		Set.insert({a[i], i});

	vector<pair<int, int>> rec;
	Add1({++T, A, A+1, 1, 0});

	rec.push_back({A-1, A+1});
	while (rec.back().second - rec.back().first < n + 1)
		rec.push_back(extend(rec.back().first, rec.back().second));

	cin>>q;
	for (int i=1, id, e, val;i<=q;i++){
		char c;
		cin>>c;
		if (c == 'E'){

			cin>>id>>e, e += 1;

			vec.clear();
			for (int j=0;j<e;j++){

				auto [vl, ind] = *rbegin(Set);
				Set.erase({vl, ind});
				vec.push_back(ind);
				val = vl;
				a[ind]++;
			}
			for (int ind : vec)
				Set.insert({a[ind], ind});


			nxt++;
			vec.push_back(id);
			Set.erase({a[id], id});
			a[id] = val;

			Set.insert({a[id], id});

			if (id == A)
				continue;
			while (rec.back().second > id and rec.back().first < id)
				rec.pop_back();
			while (rec.back().second - rec.back().first < n + 1)
				rec.push_back(extend2(rec.back().first, rec.back().second));
		}
		else{
			cin>>B;
			ans = Null;
			get(B);
			if (ans.tp == 1)
				cout<<ans.bg + ans.R - B - 2<<'\n';
			else
				cout<<ans.bg + B - ans.L - 1<<'\n';
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...