Cod sursa(job #2661755)

Utilizator loraclorac lorac lorac Data 22 octombrie 2020 17:36:28
Problema Nums Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("nums.in");
ofstream out("nums.out");
const int lim=1e5;
struct node
{
    int dp,cif;
    vector<int> vec;
}gol;
vector<node> v[lim+7];
int tree[4*lim+7];
void update(int nod,int l,int r,int poz)
{
    if(l==r)
    {
        tree[nod]++;
        return ;
    }
    int med=(l+r)/2;
    if(poz<=med) update(2*nod,l,med,poz);
    else update(2*nod+1,med+1,r,poz);
    tree[nod]=tree[2*nod]+tree[2*nod+1];
}
int query(int nod,int l,int r,int &k)
{
    if(l==r) return l;
    int med=(l+r)/2;
    if(tree[2*nod]>=k)
        return query(2*nod,l,med,k);
    k-=tree[2*nod];
    return query(2*nod+1,med+1,r,k);
}
string s;
void add(int n,int c,int nod)
{
    v[n][nod].dp++;
    if(c==n) return ;
    int nxt=0,ind;
    for(int x:v[n][nod].vec)
    if(v[n][x].cif==s[c]-'0')
    {
        nxt=x;
        break;
    }
    if(nxt==0)
    {
        nxt=v[n].size();
        v[n].push_back(gol);
        v[n][nxt].cif=s[c]-'0';
        v[n][nod].vec.push_back(nxt);
        ind=v[n][nod].vec.size()-1;
        while(ind and v[n][v[n][nod].vec[ind]].cif<v[n][v[n][nod].vec[ind-1]].cif)
            swap(v[n][nod].vec[ind],v[n][nod].vec[ind-1]),--ind;
    }
    add(n,c+1,nxt);
}
void afis(int n,int c,int k,int nod)
{
    if(c==n)
    {
        out<<'\n';
        return ;
    }
    int nxt=0;
    for(int x:v[n][nod].vec)
    if(v[n][x].dp<k)
        k-=v[n][x].dp;
    else
    {
        nxt=x;
        break;
    }
    out<<v[n][nxt].cif;
    afis(n,c+1,k,nxt);
}
int main()
{
    int tst,t,k,n;
    in>>tst;
    while(tst--)
    {
        in>>t;
        if(t==1)
        {
            in>>s;
            update(1,1,lim,s.size());
            if(v[s.size()].empty())
                v[s.size()].push_back(gol);
            add(s.size(),0,0);
        }
        else
        {
            in>>k;
            n=query(1,1,lim,k);
            afis(n,0,k,0);
        }
    }
    return 0;
}