Cod sursa(job #2162697)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 12 martie 2018 13:00:16
Problema Nums Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

struct trie
{
    int nr;
    vector<int> v;
    trie()
    {
        nr=0;
        v.resize(10);
    }
};

const int lim=100005;
vector<trie> arb[100010];
char sir[100010];
int aib[lim+10],logn;

void aib_update(int poz)
{
    for(int i=poz;i<=lim;i+=i&(-i))
        aib[i]++;
}

int query(int poz)
{
    int s=0;
    for(int i=poz;i>0;i-=i&(-i))
        s+=aib[i];
    return s;
}

int caut_bin(int val)
{
    int poz=0;
    for(int i=logn;i>=0;i--)
        if(poz+(1<<i)<=lim && aib[poz+(1<<i)]<val)
        {
            poz+=(1<<i);
            val-=aib[poz];
        }
    return poz+1;
}

void update()
{
    scanf(" %s\n",sir+1);
    int l=strlen(sir+1),nod=0,p=0;
    aib_update(l);
    for(int i=1;i<=l;i++)
    {
        if(arb[l][nod].v[sir[i]-'0']==0)
        {
            p=1;
            arb[l].push_back(trie());
            arb[l][nod].v[sir[i]-'0']=arb[l].size()-1;
        }
        nod=arb[l][nod].v[sir[i]-'0'];
        arb[l][nod].nr++;
    }
    if(p==0)
    {
        nod=0;
        for(int i=1;i<=l;i++)
        {
            nod=arb[l][nod].v[sir[i]-'0'];
            arb[l][nod].nr--;
        }
    }
}

void solve(int k,int l)
{
    int nod=0;
    char ch;
    for(int i=1;i<=l;i++)
    {
        for(int j=0;j<=9;j++)
        {
            int nod1=arb[l][nod].v[j];
            if(k<=arb[l][nod1].nr) {nod=nod1;ch='0'+j;break;}
            else k-=arb[l][nod1].nr;
        }
        printf("%c",ch);
    }
    printf("\n");
}

int main()
{
    freopen("nums.in","r",stdin);
    freopen("nums.out","w",stdout);
    int n,k,t;
    scanf("%d",&n);
    while((1<<logn)<=lim) logn++;
    logn--;
    for(int i=1;i<=lim;i++) arb[i].push_back(trie());
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&t);
        if(t==1) update();
        else
        {
            scanf("%d",&k);
            int poz=caut_bin(k);
            if(query(poz)<k) poz++;
            k-=query(poz-1);
            solve(k,poz);
        }
    }
    return 0;
}