Cod sursa(job #652616)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 25 decembrie 2011 15:22:03
Problema Nums Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <stdio.h>
#include <string.h>
#define NMAX 100005
#define LMAX (1<<18)
#define HMAX 10
int t,A[LMAX],x,y,z;
char line[NMAX];
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);
}
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 ;
			}
		}
}
void update(int st,int dr,int nod)
{
	if (st==dr)
	{
		A[nod]++;
		return ;
	}
	int mij=(st+dr)/2;
	if (x<=mij)
		update(st,mij,nod*2);
	else
		update(mij+1,dr,nod*2+1);
	A[nod]=A[nod*2]+A[nod*2+1];
}
void cauta(int st,int dr,int nod)
{
	if (st==dr)
	{
		z=st;
		return ;
	}
	int mij=(st+dr)/2; 
	if (A[nod*2]<y)
	{
		y-=A[nod*2];
		cauta(mij+1,dr,nod*2+1);
	}
	else
		cauta(st,mij,nod*2);
}
int main()
{
	freopen("nums.in","r",stdin);
	freopen("nums.out","w",stdout);
	init();
	scanf("%d\n",&t);
	int i,tip,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(1,LMAX-1,1);
				ins(T[x],line+2);
			}
		}
		if (tip==0)
		{
			scanf("%d",&y);
			cauta(1,LMAX-1,1);
			reconst(T[z],y);
			printf("\n");
		}
	}
	return 0;
}