Cod sursa(job #1409503)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 30 martie 2015 16:03:51
Problema Nums Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");

struct trie
{ int val;
  trie* fiu[11];
   trie()
  { val=0;
   for(int i=0;i<=9;i++)
    fiu[i]=NULL;
  }
};

 trie *rad,*nwrad,*el,*depth[100005];

 int n,lenact,len,use[100005]; char sir[100005];

void Add(char s[])
{ int i,len=strlen(s);
   use[len]++;
  if (len>lenact)
   {
    for(i=lenact+1;i<=len;i++)
    {
       depth[i-1]=rad;
       nwrad = new trie;
       nwrad->val=rad->val;
       nwrad->fiu[0]=rad;
       rad=nwrad;
    }
      depth[len]=rad;
    lenact=len;

   }

  el=depth[len];
   (el->val)++;
  trie *aux=el;

 for(i=0;i<len;i++)
 { if (el->fiu[s[i]-48]==NULL) el->fiu[s[i]-48]=new trie;
   el=el->fiu[s[i]-48];
    (el->val)++;
 }

}

void Query(int k)
{ int res=0,i,j,num,st;

   for(i=1;i<=lenact;i++)
    if (use[i]>=k) {res=i; break;}
     else k-=use[i];



  el=depth[res];

  for(i=1;i<=res;i++)
  { if (i>1) st=0; else st=1;
     for(j=st;j<=9;j++)
      if (el->fiu[j]!=NULL)
      { num=el->fiu[j]->val;
        if (num>=k) {g<<j; el=el->fiu[j]; break;}
         else k-=num;
      }
  }

 g<<"\n";
 }
int main()
{ int i,t,k;
   rad=new trie;

    f>>n;

  for(i=1;i<=n;i++)
  { f>>t;

     if (!t) {f>>k; Query(k);}
      else {f>>sir; Add(sir);}

  }


    return 0;
}