제출 #1349036

#제출 시각아이디문제언어결과실행 시간메모리
1349036Faisal_Saqib케이크 (CEOI14_cake)C++20
100 / 100
1271 ms16812 KiB
#include <iostream>
#include <set>
#include <vector>
using namespace std;
const int N=3e5+10;
int d[N],seg[N<<2],n;
set<pair<int,int>> cur;
void Set(int i,int v,int l=1,int r=n,int nn=1)
{
	if(i<l or r<i)
	{
		return;
	}
	if(l==r)
	{
		seg[nn]=v;
		return;
	}
	int m=(l+r)>>1,lc=nn<<1,rc=lc|1;
	Set(i,v,l,m,lc);
	Set(i,v,m+1,r,rc);
	seg[nn]=max(seg[lc],seg[rc]);
}
int Get(int ql=1,int qr=n,int l=1,int r=n,int v=1)
{
	if(qr<l or r<ql)return -1e9;
	if(ql<=l and r<=qr)
	{
		return seg[v];
	}
	int m=(l+r)>>1,lc=v<<1,rc=lc|1;
	return max(Get(ql,qr,l,m,lc),Get(ql,qr,m+1,r,rc));
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int a;
	cin>>n>>a;
	for(int i=1;i<=n;i++)
	{
		cin>>d[i];
		cur.insert({d[i],i});
		Set(i,d[i]);
	}
	int q;
	cin>>q;
	while(q--)
	{
		char c;
		cin>>c;
		if(c=='E')
		{
			int i,v;cin>>i>>v;
			v--;
			std::vector<int> ind;
			for(int i=0;i<v;i++)
			{
				int j=rbegin(cur)->second;
				cur.erase(--end(cur));
				ind.push_back(j);
				d[j]++;
			}
			cur.erase({d[i],i});
			d[i]=rbegin(cur)->first+1;
			ind.push_back(i);
			for(auto j:ind)
			{
				Set(j,d[j]);
				cur.insert({d[j],j});
			}
		}
		else
		{
			int b;
			cin>>b;
			if(b==a)
			{
				cout<<0<<endl;
			}
			else if(b<a)
			{
				int mx=Get(b,a-1);
				int s=a,e=n+1;
				while(s+1<e)
				{
					int m=(s+e)>>1;
					if(Get(a+1,m)<mx)
					{
						s=m;
					}
					else
					{
						e=m;
					}
				}
				cout<<s-b<<endl;
			}
			else
			{
				// cout<<"D"<<endl;
				int mx=Get(a+1,b);
				int s=0,e=a;
				while(s+1<e)
				{
					int m=(s+e)>>1;
					if(Get(m,a-1)<mx)
					{
						e=m;
					}
					else
					{
						s=m;
					}
				}
				cout<<b-e<<endl;
			}

		}
	}	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...