Cod sursa(job #1534515)

Utilizator heracleRadu Muntean heracle Data 23 noiembrie 2015 19:35:51
Problema Nums Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <cstdio>

FILE* in=fopen("nums.in","r");
FILE* out=fopen("nums.out","w");

struct trie
{
    //saver nxt;
    trie *nxt[10];
    int nrtot;
    trie()
    {
        nrtot=0;
        //nxt->tipe=0;
    }
} *rad[100007];

char input[(6<<20)+29999];
int n;
int p=0;
char aux[100007];

bool adaos;

trie *add(trie *nod, char v[])
{
    if(nod==NULL)
        nod=new trie;

    if(v[0]==-1)
    {
        if(nod->nrtot==0)
        {
            nod->nrtot++;
            adaos=1;
        }
        else
            adaos=0;
        return nod;
    }

    nod->nxt[v[0]]=add(nod->nxt[v[0]],v+1);
    nod->nrtot+=adaos;

    return nod;

}

int aib[130007];

int ask(int &x)
{
    int pst=0,pow=1<<16;

    while(pow)
    {
        if(aib[pow+pst]<x)
        {
            pst+=pow;
            x-=aib[pst];
        }
        pow/=2;
    }
    return pst+1;
}

void update(int poz, int val)
{
    while(poz<130007)
    {
        aib[poz]+=val;
        poz+=poz&(-poz);
    }
}

int contor;

void afis(trie *nod, int nr)
{
    for(int i=0; i<=9; i++)
    {
        if(nod->nxt[i])
        {
            if(nod->nxt[i]->nrtot<nr)
            {
                nr-=nod->nxt[i]->nrtot;
            }
            else
            {
                aux[++contor]=i+'0';
                afis(nod->nxt[i],nr);
                return;
            }
        }
    }
}

int main()
{
    fscanf(in,"%d",&n);
    fread(input,6<<20,1,in);

    int act;
    int ax;
    for(int i=1; i<=n; i++)
    {
        p++;
        if(input[p]=='0')
        {
            p+=2;
            act=0;
            while(input[p]!='\n')
            {
                act=act*10+input[p]-'0';
                p++;
            }

            ax=ask(act);
            contor=0;
            afis(rad[ax],act);
            aux[++contor]=0;
            fputs(aux+1,out);
            fprintf(out,"\n");
        }
        else
        {
            p+=2;

            act=0;
            while(input[p]!='\n')
            {
                aux[act]=input[p]-'0';
                p++;
                act++;
            }
            aux[act]=-1;


            if(rad[act])
                ax=rad[act]->nrtot;
            else
                ax=0;
            rad[act]=add(rad[act],aux);

            update(act, rad[act]->nrtot-ax);
        }
    }

    return 0;
}