Cod sursa(job #2209590)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 3 iunie 2018 20:31:35
Problema Nums Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <bits/stdc++.h>

using namespace std;

struct trie{
    int guys;
    trie *f[10];
    trie(){
        memset(f, 0, sizeof(f));
        guys = 0;
    }
};

int test, qr, aint[400005];
trie *rad[100005];

void update(int nod, int st, int dr, int pos)
{
    if(st == dr)
        ++aint[nod];
    else{
        int m = (st+dr)/2;
        if(pos <= m)
            update(nod*2, st, m, pos);
        else update(nod*2+1, m+1, dr, pos);
        aint[nod] = aint[nod*2] + aint[nod*2+1];
    }
}

int query(int nod, int st, int dr, int x)
{
    if(st == dr)
        return st;
    int m = (st+dr)/2;
    if(aint[nod*2] >= x)
        return query(nod*2, st, m, x);
    qr -= aint[nod*2];
    return query(nod*2+1, m+1, dr, x-aint[nod*2]);
}

int main()
{
    ifstream fin ("nums.in");
    ofstream fout ("nums.out");
    for (int i = 1; i <= 100000; ++i)
        rad[i] = new trie;
    fin >> test;
    while(test--){
        int t;
        string s;
        fin >> t;
        if(t == 1){
            fin >> s;
            trie *t = rad[s.length()];
            bool good = false;
            for (int i = 0; i < s.length(); ++i){
                int q = s[i]-'0';
                if(t->f[q] == NULL){
                    good = true;
                    break;
                }
                t = t->f[q];
            }
            if(!good)
                continue;
            update(1, 1, 100000, s.length());
            t = rad[s.length()];
            for (int i = 0; i < s.length(); ++i){
                int q = s[i]-'0';
                ++t->guys;
                if(t->f[q] == NULL)
                    t->f[q] = new trie;
                t = t->f[q];
            }
            ++t->guys;
        }else{
            string ans;
            fin >> qr;
            int dig = query(1, 1, 100000, qr);
            trie *t = rad[dig];
            for (int i = 1; i <= dig; ++i){
                for (int j = 0; j < 10; ++j){
                    if(t->f[j] == NULL)
                        continue;
                    if(qr > t->f[j]->guys)
                        qr -= t->f[j]->guys;
                    else{
                        ans += j+'0';
                        t = t->f[j];
                        break;
                    }
                }
            }
            fout << ans << "\n";
        }
    }
    return 0;
}