Cod sursa(job #593407)

Utilizator indestructiblecont de teste indestructible Data 2 iunie 2011 16:32:38
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <stdio.h>
#include <string.h>
#define LMAX 100005
#define HMAX 10
int t,aib[LMAX];
char line[LMAX];
struct trie
{
	int nr,pass;
	trie *fiu[HMAX];
	trie()
	{
		nr=0; pass=0;
		memset(fiu,0,sizeof(fiu));
	}
};
trie *T[LMAX];
void init()
{
	int i;
	for (i=1; i<LMAX; i++)
		T[i]=new trie;
}
inline int cif(char x)
{
	return x>='0' & x<='9';
}
int find(trie *nod,char *s)
{
	if (*s=='\n')
		return nod->nr;
	if (nod->fiu[*s-'0']==0)
		return 0;
	return find(nod->fiu[*s-'0'],s+1);
}
void ins(trie *nod,char *s)
{
	nod->pass++;
	if (*s=='\n')
	{
		nod->nr++;
		return ;
	}
	if (nod->fiu[*s-'0']==0)
		nod->fiu[*s-'0']=new trie;
	ins(nod->fiu[*s-'0'],s+1);
}
int lsb(int x)
{
	return x & -x;
}
void update(int x,int val)
{
	int i;
	for (i=x; i<LMAX; i+=lsb(i))
		aib[i]+=val;
}
int suma(int x)
{
	int i,s=0;
	for (i=x; i>0; i-=lsb(i))
		s+=aib[i];
	return s;
}
int cbin(int val)
{
	int i,step=(1<<16);
	for (i=0; step; step>>=1)
		if (i+step<LMAX && suma(i+step)<val)
			i+=step;
	return ++i;
}
void reconst(trie *nod,int val)
{
	int i,val2=val;
	for (i=0; i<=9; i++)
		if (nod->fiu[i])
		{
			if ((nod->fiu[i])->pass<val2)
				val2-=(nod->fiu[i])->pass;
			else
			{
				printf("%d",i);
				reconst(nod->fiu[i],val2);
				return ;
			}
		}
}
int main()
{
	freopen("nums.in","r",stdin);
	freopen("nums.out","w",stdout);
	init();
	scanf("%d\n",&t);
	int i,tip,x,y,z,poz;
	for (i=1; i<=t; i++)
	{
		scanf("%d",&tip);
		if (tip==1)
		{
			fgets(line+1,LMAX,stdin);
			x=0; poz=1;
			while (cif(line[poz+1])) poz++,x++;
			if (!find(T[x],line+2))
			{
				update(x,1);
				ins(T[x],line+2);
			}
		}
		if (tip==0)
		{
			scanf("%d",&y);
			z=cbin(y);
			y-=suma(z-1);
			//reconst(T[z],y);
			printf("\n");
		}
	}
	return 0;
}