Cod sursa(job #1667234)

Utilizator lupvasileLup Vasile lupvasile Data 28 martie 2016 19:29:53
Problema Nums Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
#ifdef INFOARENA
#define cout fout
#endif // INFOARENA
ifstream fin("nums.in");
ofstream fout("nums.out");
/// ////////////////////////////////

#define nmax 100003

struct T_NODE
{
    T_NODE *fii[10];
    int nr[10];
    bool last;
    T_NODE()
    {
        for(int i=0; i<10; ++i) fii[i]=0,nr[i]=0;
        last=0;
    }
};

T_NODE *tries[nmax];

int n,len;
char s[nmax],res[nmax],l;
int aib[nmax];
T_NODE *alpha_root;

void trie_add(T_NODE *nod, int p)
{
    if(p==len)
    {
        nod->last=1;
        return;
    }

    int son=s[p]-48;

    if(!nod->fii[son]) nod->fii[son]=new T_NODE();
    ++nod->nr[son];
    trie_add(nod->fii[son],p+1);
}

void trie_query(T_NODE *nod,int k)
{
    if(nod->last) return;
    int son;
    for(son=0; k>0; ++son) k-=nod->nr[son];

    --son;
    res[++l]=son+48;

    trie_query(nod->fii[son],k+nod->nr[son]);

}

void update_aib(int pos)
{
    for(; pos<nmax; pos+=(pos&(-pos))) ++aib[pos];
}

int query_aib(int &k)
{
    int step,pos=0;
    step=65536;
    for(; step; step>>=1)
        if(pos+step<nmax)
            if(aib[pos+step]<k)
            {
                pos+=step;
                k-=aib[pos];
            }

    return pos;
}

int main()
{
    int i,tip,k,pos;

    alpha_root=new T_NODE();
    tries[100000]=alpha_root;
    for(i=99999;i;--i)
        tries[i]=(tries[i+1]->fii[0] = new T_NODE());

    fin>>n;
    for(i=1; i<=n; ++i)
    {
        fin>>tip;
        if(tip==1)
        {
            fin>>s;
            len=strlen(s);

            trie_add(tries[len],0);
            update_aib(len);
        }
        else
        {
            fin>>k;
            pos=query_aib(k);
            ++pos;
            l=-1;
            trie_query(tries[pos],k);
            res[++l]='\0';
            cout<<res<<'\n';
        }
    }

    return 0;
}