AOJ1083 The Incubator

データ構造弱いので書いてみようかなと思ってやった。
BITかいて適当にほげほげする。クエリ先読みした(罪悪感)
はじめてのBIT。
オーダーはO(Q log^2Q)。
バグに苦しんで3時間以上かけてしまった。

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>bit;
vector<int>damy;
int bitsize;
void init(int a)
{
	bit=damy;
	bitsize=1;
	for(;bitsize<a;bitsize*=2){}
	bitsize++;
	for(int j=0;j<bitsize;j++)
	{
		bit.push_back(0);
	}
}
int sum(int a)
{
	int sumn=0;
	for(;a>0;)
	{
		sumn+=bit[a];
		a-=a&-a;
	}
	return sumn;
}
void add(int a,int b)
{
	for(;a<bitsize;)
	{
		bit[a]+=b;
		a+=a&-a;
	}
}
int main()
{
	for(;;)
	{
		int query,lon;
		scanf("%d%d",&query,&lon);
		if(query==0&&lon==0)
		{
			break;
		}
		init(query);
		vector<pair<int,int> >vec;
		vector<pair<int,int> >bio;
		vector<int>ans;
		for(int i=0;i<query;i++)
		{
			int za,zb;
			scanf("%d%d",&za,&zb);
			vec.push_back(make_pair(za,zb));
			if(za==0)
			{
				bio.push_back(make_pair(zb,-1));
				ans.push_back(zb);
			}
		}
		sort(bio.begin(),bio.end());
		vector<int>map;
		int sta=1,you=0;
		for(int j=0;j<query;j++)
		{
			if(vec[j].first==0)
			{
				int low=lower_bound(bio.begin(),bio.end(),make_pair(vec[j].second,-1))-bio.begin();
				map.push_back(vec[j].second);
				bio[low].second=map.size();
				you++;
				if(you>lon)
				{
					int zan=sta;
					you--;
					int now=sta-sum(sta);
					for(;;)
					{
						sta++;
						if(sta-sum(sta)!=now)
						{
							break;
						}
					}
					add(zan,1);
				}
			}
			if(vec[j].first==3)
			{
				int low=lower_bound(bio.begin(),bio.end(),make_pair(vec[j].second,-1))-bio.begin();
				add(bio[low].second,1);
				you--;
				if(bio[low].second==sta)
				{
					int now=sta-sum(sta);
					for(;;)
					{
						sta++;
						if(sta-sum(sta)!=now)
						{
							break;
						}
					}
				}
			}
			if(vec[j].first==1||vec[j].first==2)
			{
				int han=0;
				if(vec[j].first==1&&vec[j].second==1)
				{
					han=1;
				}
				int beg=1,end=map.size();
				int ban=0;
				int fuga=vec[j].second;
				fuga+=sta-sum(sta)-1;
				for(;;)
				{
					int med=(beg+end)/2;
					if(med-sum(med)<fuga)
					{
						beg=med+1;
					}
					else
					{
						end=med;
					}
					if(end==beg)
					{
						ban=beg;
						break;
					}
				}
				if(vec[j].first==1)
				{
					add(ban,1);
					you--;
					if(han==1)
					{
						int now=sta-sum(sta);
						for(;;)
						{
							sta++;
							if(sta-sum(sta)!=now)
							{
								break;
							}
						}
					}
				}
				else
				{
					printf("%d\n",ans[ban-1]);
				}
			}
		}
		printf("end\n");
	}
}