Cod sursa(job #2209568)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 3 iunie 2018 19:58:07
Problema Nums Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
int n;
int aib[100002];
void add(int nod)
{
    for(;nod<=100000;nod+=(nod&(-nod)))
        aib[nod]++;
}
int compute(int nod)
{
    int sol=0;
    for(;nod;nod-=(nod&(-nod)))
        sol+=aib[nod];
    return sol;
}
struct trie
{
    trie *nod[10];
    int counter;
    trie()
    {
        counter=0;
        memset(nod,NULL,sizeof(nod));
    }
};
trie *r[100002];
bool gs(string x)
{
    trie *t=r[x.size()];
    for(int i=0;i<x.size();++i)
    {
        int qq=x[i]-'0';
        if(!t->nod[qq])
            return 0;
        t=t->nod[qq];
    }
    return 1;
}
void baga(string x)
{
    trie *t=r[x.size()];
    ++t->counter;
    for(int i=0;i<x.size();++i)
    {
        int qq=x[i]-'0';
        if(!t->nod[qq])
            t->nod[qq]=new trie;
        t=t->nod[qq];
        ++t->counter;
    }
}
void qu(int unde,int rem)
{
    trie *t=r[unde];
    int sol=1;
    string xx;
    for(int i=0;i<unde;++i)
    {
        int pnext=-1;
        for(int j=0;j<10;++j)
            if(t->nod[j])
            {
                if(t->nod[j]->counter<rem)
                    rem-=t->nod[j]->counter;
                else
                {
                    pnext=j;
                    break;
                }
            }
        xx+=(pnext+'0');
        t=t->nod[pnext];
    }
    g<<xx<<'\n';
}
string x;
int main()
{
    f>>n;
    for(int i=1;i<=100000;++i)
        r[i]=new trie;
    for(int i=1;i<=n;++i)
    {
        int tip;
        f>>tip;
        if(tip==1)
        {
            f>>x;
            if(!gs(x))
            {
                add(x.size());
                baga(x);
            }
        }
        if(tip==0)
        {
            int nr;
            f>>nr;
            int stp=1;
            for(;stp*2<=100000;stp*=2);
            int qx=0;
            for(;stp;stp>>=1)
            {
                if(stp+qx<=100000 && compute(stp+qx)<nr)
                    qx+=stp;
            }
            nr-=compute(qx);
            ++qx;
            qu(qx,nr);
        }
    }
    return 0;
}