Cod sursa(job #539509)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 22 februarie 2011 23:27:00
Problema Nums Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include<cstdio>
#include<cstring>
struct Nod
{
    int nrc;
    Nod *f[10];
    Nod()
    {
        for(int i=0;i<10;i++)
            f[i]=false;
        nrc=0;
    }
};
const int N=25005;
int pp,n,len,pi[4*N],pf[4*N],s[4*N];
bool ok;
char str[N];
void updateai(int nod,int val)
{
    s[nod]++;
    if(pi[nod]==pf[nod])
        return;
    if(pi[2*nod]<=val && val<=pf[2*nod])
        updateai(2*nod,val);
    else
        updateai(2*nod+1,val);
}
void init()
{
    int m;
    pi[1]=1;
    pf[1]=25000;
    for(int i=1;i<4*N;i++)
        if(pi[i]!=pf[i])
        {
            m=(pi[i]+pf[i])/2;
            pi[2*i]=pi[i];
            pf[2*i]=m;
            pi[2*i+1]=m+1;
            pf[2*i+1]=pf[i];
        }
}
bool verif(Nod *nod,int poz)
{
    if(poz==len)
        return true;
    if(nod->f[str[poz]-'0'])
        return verif(nod->f[str[poz]-'0'],poz+1);
    return false;
}
void insert(Nod *nod,int poz)
{
    ++nod->nrc;
    if(poz==len)
        return;
    if(nod->f[str[poz]-'0'])
    {
        insert(nod->f[str[poz]-'0'],poz+1);
        return;
    }
    nod->f[str[poz]-'0']=new Nod();
    insert(nod->f[str[poz]-'0'],poz+1);
}
int searchai(int nod,int val)
{
    if(pi[nod]==pf[nod])
        return nod;
    if(val<=s[2*nod])
        return searchai(2*nod,val);
    return searchai(2*nod+1,val-s[2*nod]);
}
int sumaai(int nod,int val)
{
    if(pi[nod]==pf[nod])
        return 0;
    if(val>s[2*nod])
        return s[2*nod]+sumaai(2*nod+1,val-s[2*nod]);
    return sumaai(2*nod,val);
}
void search(Nod *nod,int ord)
{
    for(int i=0;i<10;i++)
        if(nod->f[i])
        {
            if(pp+nod->f[i]->nrc<ord)
            {
                pp+=nod->f[i]->nrc;
                continue;
            }
            ok=true;
            if(ok==true)
                printf("%d",i);
            search(nod->f[i],ord);
            return;
        }
}
void read()
{
    freopen("nums.in","r",stdin);
    freopen("nums.out","w",stdout);
    int op,poz;
    scanf("%d",&n);
    Nod *first[N];
    for(int i=1;i<N;i++)
        first[i]=new Nod();
    init();
    for(int i=1;i<=n;i++)
    {
        scanf("%d ",&op);
        if(op==1)
        {
            scanf("%s\n",&str);
            len=strlen(str);
            if(!verif(first[len],0))
            {
                updateai(1,len);
                insert(first[len],0);
            }
        }
        else
        {
            scanf("%d",&poz);
            int x=pi[searchai(1,poz)];
            int si=sumaai(1,poz);
            pp=0;
            ok=false;
            search(first[x],poz-si);
            printf("\n");
        }
    }
}
int main()
{
    read();
    return 0;
}