Cod sursa(job #319645)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 1 iunie 2009 18:12:22
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<stdio.h>
#include<string>
#include<vector>
using namespace std;
FILE*fin=fopen("nums.in","r");
FILE*fout=fopen("nums.out","w");
#define nn 1500000
int value[nn],nrnod=1,dir[nn][10],cmax=0,n;
char s[100005],sa[2],si[100005];
int find(int nod,int poz)
{
	if(poz==cmax) return 1;
	if(dir[nod][si[poz]-'0']) return find(dir[nod][si[poz]-'0'],poz+1);
	else return 0;
}
/*
void ins(int nod,int poz)
{
	value[nod]++;
	if(poz==cmax) return ;
	if(!dir[nod][si[poz]-'0'])
    {
		nrnod++;
		dir[nod][si[poz]-'0']=nrnod;
	}		
	ins(dir[nod][si[poz]-'0'],poz+1);
}
*/
void ins(int dnod,int dpoz)
{
  int nod=dnod,poz=dpoz;   
  while(1==1)
  {
    value[nod]++;
    if(poz==cmax) return ;
    if(!dir[nod][si[poz]-'0'])
    {
		nrnod++;
		dir[nod][si[poz]-'0']=nrnod;
	}		
	nod=dir[nod][si[poz]-'0'];
	poz++;
  }
}
void getkth(int nod,int poz,int k)
{
	int cv=0,i,nnod,pv=0;
	for(i=0;i<=9;i++)
	{
		nnod=dir[nod][i];
		pv=cv;
		cv+=value[nnod];
		if(cv>=k) 
		{
			si[poz]=char('0'+i);
			if(poz==cmax-1) return ;
			else getkth(nnod,poz+1,k-pv);
			return ;
		}	
	}	
}
int main()
{
	int i,j,k,dim,is
	;
	fscanf(fin,"%d\n",&n);
	for(i=1;i<=n;i++)
	{
		fscanf(fin,"%s",&sa);
		fscanf(fin,"%s",&s);
		dim=strlen(s);
		if(sa[0]=='1') cmax=max(cmax,dim);
	}
	fclose(fin);
	FILE*fin=fopen("nums.in","r");
	fscanf(fin,"%d\n",&n);
	for(i=1;i<=n;i++)
	{
		fscanf(fin,"%s",&sa);
		fscanf(fin,"%s",&s);
		dim=strlen(s);
		for(j=0;j<cmax-dim;j++)
		  si[j]='0';
		for(j=0;j<dim;j++)
		  si[cmax-dim+j]=s[j];	
		if(sa[0]=='1')
		{	
			is=find(1,0);
			if(!is) ins(1,0);
			
		}	
		else
		{
	        k=0;
			for(j=0;j<dim;j++)
				k=k*10+(s[j]-'0');	
			getkth(1,0,k);
			j=0;
			while(si[j]=='0') j++;
			for(;j<cmax;j++)
				fprintf(fout,"%c",si[j]);
			fprintf(fout,"\n");	
		}	
	}	
	
	fclose(fin);
	fclose(fout);
	return 0;
}