Cod sursa(job #320423)

Utilizator DastasIonescu Vlad Dastas Data 4 iunie 2009 18:21:29
Problema Nums Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 1 << 18;

ifstream in("nums.in");
ofstream out("nums.out");

struct trie
{
    int nr;

    trie *next[10];

    trie()
    {
        nr = 0;
        memset(next, 0, sizeof(next));
    }
};

struct info
{
    int nr;

    trie *T;

    info()
    {
        nr = 0;
        T = new trie;
    }
};

int n;
info a[maxn];
char buf[maxn];

int insert(trie *node, char *num, int ok)
{
    if ( *num == '\0' )
    {
        node->nr = ok;
        return ok;
    }

    int val = *num - '0';

    if ( !node->next[val] )
    {
        node->next[val] = new trie;
        ok = 1;
    }

    node->nr += insert(node->next[val], num + 1, ok);
}

void update(int nod, int st, int dr, int len)
{
    if ( len < st || len > dr )
        return;

    if ( st == dr )
    {
        insert(a[nod].T, buf, 0);

        a[nod].nr = a[nod].T->nr;

        return;
    }

    int q = nod << 1;
    int m = (st + dr) >> 1;

    update(q, st, m, len);
    update(q+1, m+1, dr, len);

    a[nod].nr = a[q].nr + a[q+1].nr;
}

void print_kth(trie *node, int poz, int step, int len, char cif)
{
    if ( cif != '-' )
        out << cif;

    if ( !node )
        return;

    int start = -1;

    for ( int i = 0; i < 10; ++i )
        if ( node->next[i] )
        {
            if ( node->next[i]->nr < poz )
                poz -= node->next[i]->nr;
            else
            {
                start = i;
                break;
            }
        }

    if ( start == -1 )
        return;

    print_kth(node->next[start], poz, step + 1, len, start + '0');
}

void query(int nod, int st, int dr, int poz)
{
    if ( st == dr )
    {
        print_kth(a[nod].T, poz, 0, st, '-');

        return;
    }

    int q = nod << 1;
    int m = (st + dr) >> 1;

    if ( a[q].nr < poz )        query(q+1, m+1, dr, poz - a[q].nr);
    else                        query(q, st, m, poz);
}

int main()
{
    in >> n;

    int op, k, t;
    int maxlen = -1;
    for ( int i = 1; i <= n; ++i )
    {
        in >> op;
        if ( op == 1 )
        {
            in >> buf;

            int t = strlen(buf);
            if ( t > maxlen )
                maxlen = t;

            update(1, 1, maxlen, t);
        }
        else
        {
            in >> k;
            query(1, 1, maxlen, k);
            out << '\n';
        }
    }

    return 0;
}