Cod sursa(job #319318)

Utilizator AndreyPAndrei Poenaru AndreyP Data 31 mai 2009 14:51:04
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<bitset>
using namespace std;
#define N 100010
char *a[N];
int lg[N],op[N],ref[N],n,num[N],nr,nmax,arb[N],cine[N];
bitset<N> viz;
bool compar(const int &x,const int &y)
{
	if(lg[x]<lg[y])
		return true;
	if(lg[x]>lg[y])
		return false;
	for(int i=0; i<lg[x]; ++i)
	{
		if(a[x][i]!=a[y][i])
		{
			if(a[x][i]<a[y][i])
				return true;
			return false;
		}
	}
	return false;
}
inline bool lafel(int x,int y)
{
	if(lg[x]!=lg[y])
		return false;
	for(int i=0; i<lg[x]; ++i)
	{
		if(a[x][i]!=a[y][i])
			return false;
	}
	return true;
}
inline void normalizare()
{
	char c[N];
	int cate=0;
	scanf("%d\n",&n);
	for(int i=1; i<=n; ++i)
	{
		fgets(c,N,stdin);
		if(c[0]=='0')
		{
			int x=0;
			for(int j=2; c[j]>='0' && c[j]<='9'; ++j)
				x=x*10+c[j]-'0';
			op[i]=x;
			continue;
		}
		int j=2;
		for(; c[j]>='0' && c[j]<='9'; ++j)
			;
		--j,--j;
		++cate;
		ref[cate]=cate;
		lg[cate]=j;
		a[cate]=new char[j+2];
		a[cate][j]='\0';
		memcpy(a[cate],c+2,j);
	}
	sort(ref+1,ref+cate+1,compar);
	nr=1;
	num[ref[1]]=1;
	cine[1]=ref[1];
	for(int i=2; i<=cate; ++i)
	{
		if(lafel(ref[i-1],ref[i]))
		{
			num[ref[i]]=nr;
			continue;
		}
		num[ref[i]]=++nr;
		cine[nr]=ref[i];
	}
	/*for(int i=1; i<=cate; ++i)
	{
		fputs(a[i],stderr);
		fprintf(stderr," %d %d\n",num[i],ref[i]);
	}*/
}
inline int nrb(int x)
{
	return ((x&(x-1))^x);
}
inline void adauga(int poz)
{
	for(; poz<=nr; poz+=nrb(poz))
		++arb[poz];
}
inline int suma(int poz)
{
	int s=0;
	for(; poz; poz-=nrb(poz))
		s+=arb[poz];
	return s;
}
inline int find(int x)
{
	int p=1,u=nr;
	while(p<u)
	{
		int m=(p+u)>>1;
		if(x<=suma(m))
			u=m;
		else
			p=m+1;
	}
	return p;
}
inline void rezolva()
{
	//fprintf(stderr,"%d\n",n);
	for(int i=1,j=0; i<=n; ++i)
	{
		if(op[i])
		{
			fputs(a[cine[find(op[i])]],stdout);
			fputc('\n',stdout);
			continue;
		}
		++j;
		//fprintf(stderr,"%d ",j);
		if(viz[num[j]])
			continue;
		viz[num[j]]=1;
		//fprintf(stderr,"%d\n",num[j]);
		adauga(num[j]);
	}
}
int main()
{
	freopen("nums.in","r",stdin);
	freopen("nums.out","w",stdout);
	normalizare();
	rezolva();
	return 0;
}