Cod sursa(job #306857)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 22 aprilie 2009 00:21:23
Problema Nums Scor Ascuns
Compilator cpp Status done
Runda Marime 1.66 kb
#include<stdio.h>
#include<string.h>
#define N 100010
int n,nr;
int mar[N],spatiu[N+N],*v=spatiu+N,mc;
char c[N],*c1=c+2;
char *a[N];
char cmp(int x)
{
	if(mc<mar[x])
		return -1;
	if(mc>mar[x])
		return 1;
	for(int i=0; i<mc; ++i)
	{
		if(c1[i]!=a[x][i])
		{
			if(c1[i]<a[x][i])
				return -1;
			return 1;
		}
	}
	return 0;
}
int caut()
{
	int p=1,u=nr;
	while(p<u)
	{
		int m=(p+u)>>1;
		if(cmp(v[m])!=1)
			u=m;
		else
			p=m+1;
	}
	if(cmp(v[p])==-1)
		--p;
	if(cmp(v[p])==0)
		return -1;
	return p;
}
inline void baga()
{
	int i;
	for(i=0; c1[i]>='0' && c1[i]<='9'; ++i)
		;
	mc=i;
	if(nr==0)
	{
		++nr;
		mar[nr]=mc;
		a[nr]=new char[mc+3];
		memcpy(a[nr],c1,mc);
		a[nr][mar[nr]]=0;
		v[1]=nr;
		return;
	}
	if(cmp(v[1])==-1)
	{
		++nr;
		--v;
		mar[nr]=mc;
		a[nr]=new char[mc+3];
		memcpy(a[nr],c1,mc);
		a[nr][mar[nr]]=0;
		v[1]=nr;
		return;
	}
	int aux=caut();
	if(aux==-1)
		return;
	++nr;
	mar[nr]=mc;
	a[nr]=new char [mc+3];
	memcpy(a[nr],c1,mc);
	a[nr][mar[nr]]=0;
	int m=(nr-1)>>1;
	if(aux>=m)
	{
		for(int i=nr-1; i>aux; --i)
			v[i+1]=v[i];
		v[aux+1]=nr;
	}
	else
	{
		for(int i=1; i<=aux; ++i)
			v[i-1]=v[i];
		v[aux]=nr;
		--v;
	}
}
int main()
{
	freopen("nums.in","r",stdin);
	freopen("nums.out","w",stdout);
	scanf("%d\n",&n);
	for(; n; --n)
	{
		fgets(c,N,stdin);
		if(c[0]=='1')
			baga();
		else
		{
			int aux=0;
			for(int i=2; c[i]>='0' && c[i]<='9'; ++i)
				aux=aux*10+c[i]-'0';
			fputs(a[v[aux]],stdout);
			fputc('\n',stdout);
		}
	}
	/*printf("\n\n");
	for(int i=1; i<=nr; ++i)
	{
		fputs(a[v[i]],stdout);
		fputc('\n',stdout);
	}*/
	return 0;
}