记录编号 245246 评测结果 AAAAAA
题目名称 [POJ 1442] 黑盒子 最终得分 100
用户昵称 Gravatar/k 是否通过 通过
代码语言 C++ 运行时间 0.049 s
提交时间 2016-04-02 17:47:03 内存使用 1.23 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
int I=0,rt=0,cnt;
struct PoPoQQQ
{
	struct u
	{
		int f;
		int s;
		int z;
		int d;
		int e[2];
	}c[30010];
	/*void gts()
	{
		printf("%d\n",rt);
		for(int i=1;i<=cnt;i++)
		    printf("%d %d %d %d %d %d\n",c[i].f,c[i].e[0],c[i].e[1],c[i].z,c[i].d,c[i].s);
	}*/
	void Update(int a)
	{
		c[a].s=c[c[a].e[0]].s+c[c[a].e[1]].s+c[a].d;
	}
	void gy(int a)
	{
		int x=c[a].f;
		int o=c[x].f;
		c[a].f=c[x].f;
		c[x].e[0]=c[a].e[1];
		c[c[a].e[1]].f=x;
		c[x].f=a;
		c[a].e[1]=x;
		if(o)
		{
			if(c[o].e[0]==x)
			    c[o].e[0]=a;
			else
			    c[o].e[1]=a;
		}
		Update(x);
		Update(a);
	}
	void gz(int a)
	{
		int x=c[a].f;
		int o=c[x].f;
		c[a].f=c[x].f;
		c[x].e[1]=c[a].e[0];
		c[c[a].e[0]].f=x;
		c[x].f=a;
		c[a].e[0]=x;
		if(o)
		{
			if(c[o].e[0]==x)
			    c[o].e[0]=a;
			else
			    c[o].e[1]=a;
		}
		Update(x);
		Update(a);
	}
	void Splay(int a)
	{
		//puts("----------------------------------");
		//gts();
		while(c[a].f!=0)
		{
			int x=c[a].f;
			if(c[x].e[0]==a)
			    gy(a);
			else
			    gz(a);
		}
		rt=a;
		//gts();
		//puts("----------------------------------");
	}
	void Insert(int a)
	{
		int k=rt;
		int fa=0;
		while(k)
		{
			fa=k;
			if(c[k].z==a)
			{
				c[k].s++;
				c[k].d++;
				Splay(k);
				return;
			}
			if(c[k].z<a)
			    k=c[k].e[1];
			else
			    k=c[k].e[0];
		}
		++cnt;
		c[cnt].z=a;
		c[cnt].d=c[cnt].s=1;
		if(fa==0)
		    rt=cnt;
		else
		{
			c[cnt].f=fa;
			if(c[fa].z<a)
			    c[fa].e[1]=cnt;
			else
			    c[fa].e[0]=cnt;
			Splay(cnt);
		}
	}
	void gw()
	{
		++I;
		int o=I;
		//printf("G%d\n",o);
		int p=rt;
		while(1)
		{
			//printf("H");
			if(c[c[p].e[0]].s>=o)
			    p=c[p].e[0];
			else if(c[c[p].e[0]].s+c[p].d>=o)
			{
				printf("%d\n",c[p].z);
				return;
			}
			else
			{
				o-=c[c[p].e[0]].s+c[p].d;
				p=c[p].e[1];
			}
		}
	}
}splay;
int n,m,A[30010],u[30010];
int main()
{
	freopen("blackbox.in","r",stdin);
	freopen("blackbox.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	    scanf("%d",&A[i]);
	for(int i=1;i<=m;i++)
	    scanf("%d",&u[i]);
	int l=1;
	for(int i=1;i<=n;i++)
	{
		splay.Insert(A[i]);
		//printf("I%d ",i);
		while(l<=m&&u[l]==i)
		{
			//printf("L");
			splay.gw();
			++l;
		}
	}
	getchar();
	getchar();
}