Cod sursa(job #420375)

Utilizator katakunaCazacu Alexandru katakuna Data 18 martie 2010 21:55:30
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Lmax 100001

struct Trie {
	int nr;
	bool viz;
	Trie *fiu[10];
	
	Trie () {
		nr = viz = 0;
		memset (fiu, 0, sizeof (fiu));
	}
	
} *R[Lmax]; 

int T, tip, k, len, i, p;
int AI[Lmax * 4], poz;
char nr[Lmax];

#define MIJ ((st + dr) >> 1)
#define N1 (nod << 1)
#define N2 ((nod << 1) + 1)

void add_trie (Trie *R) {
	
	if (nr[p] == '\n') {
		R->nr++;
		R->viz = 1;
		return ;
	}
	
	if (!R->fiu[ nr[p] - '0' ]) 
		R->fiu[nr[p] - '0'] = new Trie;
	
	p++;
	add_trie (R->fiu[nr[p - 1] - '0']);
	p--;
	
	R->nr = 0;
	for (i = 0; i <= 9; i++) 
		if (R->fiu[i]) R->nr+= R->fiu[i]->nr;
}

int cauta_trie (Trie *R) {
	
	if (nr[p] == '\n') {
		return R->viz;
	}
	
	if (!R->fiu[ nr[p] - '0' ]) 
		return 0;
	
	p++;
	return cauta_trie (R->fiu[nr[p - 1] - '0']);
}

void query_trie (Trie *R) {
	
	if (p > len) return ;
	
	for (i = 0; i <= 9; i++) 
		if (R->fiu[i]) {
			if (k <= R->fiu[i]->nr) {
				printf ("%c", i + '0');
				p++;
				query_trie (R->fiu[i]);
				p--;
				break;
			}
			else
				k-= R->fiu[i]->nr;
		}
}

void update (int nod, int st, int dr) {
	
	if (st == dr) {
		AI[nod]++;
		return ;
	}
	
	if (poz <= MIJ) update (N1, st, MIJ);
	else update (N2, MIJ + 1, dr);
	
	AI[nod] = AI[N1] + AI[N2];
}

void query (int nod, int st, int dr) {
	
	if (st == dr) {
		len = st;
		return ;
	}
	
	if (k <= AI[N1]) 
		query (N1, st, MIJ);
	else {
		k-= AI[N1];
		query (N2, MIJ + 1, dr);
	}
}

int main () {

	freopen ("nums.in", "r" ,stdin);
	freopen ("nums.out", "w" ,stdout);
	
	int i;
	for (i = 1; i <= Lmax; i++)
		R[i] = new Trie;
	
	scanf ("%d", &T);
	for (; T; T--) {
		scanf ("%d ", &tip);
		if (tip == 1) {
			scanf ("%s", nr);
			poz = strlen (nr); nr[poz] = '\n';
			
			p = 0;
			if (!cauta_trie (R[poz])) {
				update (1, 1, Lmax);
				p = 0;
				add_trie (R[poz]);
			}
		}
		
		else {
			scanf ("%d", &k);
			query (1, 1, Lmax);
			p = 0;
			query_trie (R[len]);
			
			printf ("\n");
		}
	}
	
	return 0;
}