Cod sursa(job #359850)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 28 octombrie 2009 15:23:44
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <string.h>

struct trie{
	int numar;
	trie *a[10];
};

int ai[400010];
trie *a[100010];
int i,n,l, Max_Lung,x,k;
char s[100100];

void init(trie *&a)
{
	int i;
	a=new trie;
	a->numar = 0;
	for (i=0; i<=9; i++)
		a->a[i]=NULL;
}

int update_trie(trie *&a, int i)
{
	if (i==l){
		if (a==NULL){
			init(a);
			a->numar=1;
			return 1;
		}
		else 
			return 0;
	}
	else {
		if (a==NULL){
			init(a);
			int x=update_trie(a->a[s[i]-'0'],i+1);
			a->numar=x;
			return x;
		}
		else{
			x=update_trie(a->a[s[i]-'0'],i+1);
			a->numar+=x;
			return x;
		}
	}
}

void update_ai(int nod,int st, int dr)
{
	if (st==dr){
		ai[nod]++;
		return;
	}
	ai[nod]++;
	int mij=(st+dr)/2;
	if (l<=mij)
		update_ai(nod<<1,st,mij);
	else
		update_ai((nod<<1)+1,mij+1,dr);
}

int query_ai(int nod, int st, int dr, int &poz)
{
	if (st==dr) return st;
	int mij=(st+dr)/2;
	if (ai[nod<<1]<poz){
		poz-=ai[nod<<1];
		return query_ai((nod<<1)+1,mij+1,dr,poz);
	}
	else
		return query_ai(nod<<1,st,mij,poz);
}

void query_trie(trie *a)
{
	if (a==NULL)
		return;
	int j;
	for (j=0; j<=9; j++)
		if (a->a[j]!=NULL){
			if (a->a[j]->numar<k)
				k-=a->a[j]->numar;
			else{
				printf("%d",j);
				query_trie(a->a[j]);
				break;
			}
		}
}

int main()
{
	freopen("nums.in","r",stdin);
	freopen("nums.out","w",stdout);
	scanf("%d\n",&n); Max_Lung=5;
	for (i=1; i<=n; i++){
		scanf("%d ",&x);
		if (x==1){
			fgets(s,100100,stdin);
			l=strlen(s)-1;
			update_ai(1,1,Max_Lung);
			update_trie(a[l],0);
		}
		else {
			scanf("%d\n",&k);
			l=query_ai(1,1,Max_Lung,k);
			query_trie(a[l]);
			printf("\n");
		}
	}
}