Cod sursa(job #472924)

Utilizator APOCALYPTODragos APOCALYPTO Data 27 iulie 2010 00:23:53
Problema Nums Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<cstring>
struct nod{
    nod *ed[10];
    int sub;
    nod()
    {
        memset(ed,0,sizeof(ed));
        sub=0;
    }
};
#define Nmax 5003
typedef nod* trie;
trie pad[Nmax];
int N,nr;
char a[Nmax];
int sum;
char vector[5003];
ofstream fout("nums.out");
void insert(trie &n,int p)
{
    if(p==nr)
    {   n->sub=1;

        return;
    }

    if(n->ed[a[p]-'0']==0)
      n->ed[a[p]-'0']=new nod;

    insert(n->ed[a[p]-'0'],p+1);

    n->sub=0;
    for(int i=0;i<=9;i++)
      n->sub=(n->ed[i]==NULL)?n->sub:n->sub+n->ed[i]->sub;

}

void cauta(trie &n,int maximul,int p,int poz)
{


    if(p==maximul)
    {
    return;
    }

    for(int i=0;i<=9;i++)
    {
        if(n->ed[i]!=NULL)
     {sum+=n->ed[i]->sub;

     if(sum>=poz)
     {sum-=n->ed[i]->sub;
     vector[p]=(char)'0'+i;

     cauta(n->ed[i],maximul,p+1,poz);

     break;

     }
     }
     }

}

void query(int poz)
{ sum=0;
int i,j;
memset(vector,0,sizeof(vector));
    for( i=0;i<=Nmax-2;i++)
    {
        sum+=pad[i]->sub;

        if(sum>=poz)
        {
            sum-=pad[i]->sub;

            cauta(pad[i],i,0,poz);
            break;
        }

    }
    for(j=0;j<i;j++)
      fout<<vector[j];
      fout<<"\n";


}
void cit()
{char control[4];
int i, poz;
 ifstream fin("nums.in");
 fin>>N;
 fin.get();
 for(i=1;i<=N;i++)
    {fin.get(control,3);

    if(control[0]=='1')

     {fin.getline(a,Nmax);
     nr=strlen(a);

     insert(pad[nr],0);

     }
     else
     {
      fin>>poz;

      fin.get();
      query(poz);
     }
    }



}

int main()
{   for(int i=0;i<=Nmax-2;i++)
     pad[i]=new nod;
    cit();
    fout.close();
    return 0;
}