Cod sursa(job #357267)

Utilizator IoannaPandele Ioana Ioanna Data 18 octombrie 2009 17:24:28
Problema Nums Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<stdio.h>
#include<string.h>
#define nmax 300000
#define cmax 100000
long n;
char s[cmax+10];

struct nod
{
	long info;
	nod *u[11];
};

nod *t[nmax];

void read()
{
	scanf("%ld",&n);
}

void init(nod* &p)
{
	int i;
	for (i=0;i<=9;i++)
	{
		p->u[i]=NULL;
	}
	p->info=0;
}

void adtt(long n,long nc)
{
	long i;
	nod *p,*aux;
	p=t[n];
	p->info++;
	for (i=0;i<nc;i++)
	{
		if (p->u[s[i]-'0']==NULL)
		{
			aux=new nod;
			init(aux);
			aux->info++;
			p->u[s[i]-'0']=aux;
			p=aux;
		}
		else
		{
			p=p->u[s[i]-'0'];
			p->info++;
		}
   }
}

void update(long n,long st,long dr,long nc)
{
	long m,fs,fd;
	nod *aux;
	if (st==dr)
	{	
		adtt(n,nc);
		return;
	}
	fs=(n<<1);
	fd=fs+1;
	if (t[fs]==NULL)
	{
		aux=new nod;
		t[fs]=aux;
		init(t[fs]);
	}
	if (t[fd]==NULL)
	{
		aux=new nod;
		t[fd]=aux;
		init(t[fd]);
	}
	m=(st+dr)/2;
	if (nc<=m)
		update(n<<1,st,m,nc);
	else 
		update((n<<1)+1,m+1,dr,nc);
	t[n]->info=t[n<<1]->info+t[(n<<1)+1]->info;
}

void search(long n,long k,long nc)
{
	long i,j=-1;
	nod *p;
	p=t[n];
	for (i=0;nc;i++)
	{
		if (p->u[i]!=NULL)
			if ((p->u[i])->info>=k)
				{
					nc--;
					s[++j]=i+'0';
					p=p->u[i];
					i=-1;
				}
			else k-=((p->u[i])->info);
	}
	printf("%s\n",s);
	
}

void query(long n,long st,long dr,long k)
{
	long fs,fd,m;
	if (st==dr && t[n]->info>=k)
	{
		search(n,k,st);
		return;
	}
	fs=(n<<1);
	fd=fs+1;
	m=(st+dr)/2;
	if (t[fs]->info>=k)
		query(fs,st,m,k);
	else
	{		
		k-=t[fs]->info;
		query(fd,m+1,dr,k);
	}
}

int main()
{
	freopen("nums.in","r",stdin);
	freopen("nums.out","w",stdout);
	read();
	long i,nc,a,b,j;
	nod *aux;
	aux=new nod;
	t[1]=aux;
	init(t[1]);
	for (i=1;i<=n;i++)
	{
		scanf("%ld ",&a);
		scanf("%s",&s);
		nc=strlen(s);
		if (a==1)
		{
			update(1,1,cmax,nc);
		}
		else 
		{
			b=0;
			for (j=0;j<nc;j++)
			{
				b=b*10+s[j]-'0';
			}
			query(1,1,cmax,b);
		}
	}
	return 0;
}