Cod sursa(job #459839)

Utilizator vladiiIonescu Vlad vladii Data 31 mai 2010 13:29:41
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
using namespace std;
#define maxn 100010

int N, maxdim;
char A[maxn], B[maxn];
//aloc static Trieul
int Trie[maxn][10], val[maxn], NrNod = 1;

int find(int nod, int poz) {
	if(poz == maxdim) return 1;
	
	int next = B[poz] - '0';
	if(Trie[nod][next]) return find(Trie[nod][next], poz+1);
	else return 0;
}

void insert(int nod, int poz) {
	val[nod]++;
	if(poz == maxdim) return;
	
	int next = B[poz] - '0';
	if(!Trie[nod][next]) {
         NrNod++;
		 Trie[nod][next] = NrNod;
	}
	
	insert(Trie[nod][next], poz+1);
}

void query(int nod, int poz, int k) {
	int nw = 0, lst = 0;
	for(int i=0; i<=9; i++) {
         if(Trie[nod][i]) {
		      lst = nw;
		      nw += val[ Trie[nod][i] ];
		      if(k <= nw) {
			       B[poz] = char('0' + i);
			       if(poz == maxdim-1) return;
			       else query(Trie[nod][i], poz+1, k-lst);
			       return;
		      }
         }	
	}	
}

int main() {
    FILE *f1=fopen("nums.in", "r"), *f2=fopen("nums.out", "w");
	int i, j, t, k, len, ok;
	fscanf(f1, "%d\n", &N);
	for(i=1; i<=N; i++) {
		 fscanf(f1, "%d ", &t);
		 fgets(A, sizeof(A), f1);
		 len = strlen(A) - 1;
		 if(t == 1) maxdim = max(maxdim, len);
	}
	fclose(f1);
	
	FILE *f3=fopen("nums.in", "r");
	fscanf(f3, "%d\n", &N);
	
	for(i=1; i<=N; i++) {
		 fscanf(f3, "%d ", &t);
		 if(t == 1) {
              fgets(A, sizeof(A), f3);
		      len = strlen(A) - 1;
		      for(j=0; j<maxdim - len; j++) {
		           B[j] = '0';
              }
		      for(j=0; j<len; j++) {
		           B[maxdim - len + j] = A[j];
              }
			  ok = find(1, 0);
			  if(!ok) insert(1, 0);
		 }	
		 else {
              fscanf(f1, "%d", &k);
			  query(1, 0, k);
			  j=0;
			  while(B[j] == '0') j++;
			  for(; j<maxdim; j++) {
				   fprintf(f2, "%c", B[j]);
              }
			  fprintf(f2, "\n");	
		 }	
	}	
	
	fclose(f3); fclose(f2);
	return 0;
}