제출 #1349078

#제출 시각아이디문제언어결과실행 시간메모리
1349078MuhammadSaram케이크 (CEOI14_cake)C++20
100 / 100
628 ms17008 KiB
#include <bits/stdc++.h>

using namespace std;

#define endl '\n'

const int M = 25e4 + 1;

int seg[M*2][2], sz[2];

void modify(int p,int x,int i,int v,int s,int e)
{
	if (s+1==e)
	{
		seg[v][i]=x;
		return;
	}
	int mid=(s+e)/2, lc=v+1, rc=v+(mid-s)*2;
	if (p<mid)
		modify(p,x,i,lc,s,mid);
	else
		modify(p,x,i,rc,mid,e);
	seg[v][i]=max(seg[lc][i], seg[rc][i]);
}

int get(int l,int r,int i,int v,int s,int e)
{
	if (l>=e or r<=s) return 0;
	if (l<=s && e<=r) return seg[v][i];
	int mid=(s+e)/2, lc=v+1, rc=v+(mid-s)*2;
	return max(get(l,r,i,lc,s,mid),get(l,r,i,rc,mid,e));
}

int walk(int x,int v,int s,int e,int i)
{
	if (s+1==e) return s;
	int mid=(s+e)/2, lc=v+1, rc=v+(mid-s)*2;
	if (seg[lc][i]>x)
		return walk(x,lc,s,mid,i);
	return walk(x,rc,mid,e,i);
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL), cout.tie(NULL);

	int n, x;
	cin>>n>>x;
	int a[n+2];
	set<pair<int,int>,greater<pair<int,int>>> se;
	for (int i=1;i<=n;i++)
		cin>>a[i], se.insert({a[i],i});
	a[0]=a[n+1]=1e9;
	sz[0]=x, sz[1]=n+1-x;
	for (int i=x-1;i>=0;i--)
		modify(x-i-1,a[i],0,0,0,sz[0]);
	for (int i=x+1;i<=n+1;i++)
		modify(i-x-1,a[i],1,0,0,sz[1]);
	int q;
	cin>>q;
	while (q--)
	{
		char c;
		cin>>c;
		if (c=='E')
		{
			int i, o;
			cin>>i>>o;
			se.erase({a[i],i});
			auto it=se.begin();
			vector<int> v; 
			for (int j=1;j<o;j++) v.push_back(it->second), it++;
			a[i]=(it->first)+1, se.insert({a[i],i});
			for (int j:v)
			{
				se.erase({a[j],j}), a[j]++, se.insert({a[j],j});
				if (j==x) continue;
				int id=(j>x);
				modify(abs(j-x)-1,a[j],id,0,0,sz[id]);
			}
			if (i==x) continue;
			int id=(i>x);
			modify(abs(i-x)-1,a[i],id,0,0,sz[id]);
		}
		else
		{
			int i;cin>>i;
			if (i==x)
			{
				cout<<0<<endl;
				continue;
			}
			int id=(i>x), id1=abs(i-x)-1;
			int ans=id1+1+walk(get(0,id1+1,id,0,0,sz[id]),0,0,sz[1-id],1-id);
			cout<<ans<<endl;
		}
	}

	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...