Cod sursa(job #2605108)

Utilizator alextodoranTodoran Alexandru Raul alextodoran Data 24 aprilie 2020 14:10:43
Problema Nums Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.96 kb
#include <bits/stdc++.h>

using namespace std;

FILE* fin = fopen("nums.in", "r");
ofstream fout ("nums.out");

const int N_MAX = 100002;
const int D_MAX = 100002;

const int BUFFER_SIZE = 1000000;

char buffer[BUFFER_SIZE];
int bpos = BUFFER_SIZE - 1;

char read_char ()
{
    bpos++;
    if(bpos == BUFFER_SIZE)
    {
        fread(buffer, sizeof(char), BUFFER_SIZE, fin);
        bpos = 0;
    }
    return buffer[bpos];
}

bool isDigit[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

int read_int ()
{
    char c;
    while(!isDigit[c = read_char()] && c != '-');
    int ans = 0;
    bool neg = false;
    if(c == '-')
    {
        neg = true;
        c = read_char();
    }
    while(isDigit[c])
    {
        ans = ans * 10 + c - '0';
        c = read_char();
    }
    if(neg == true)
        ans *= -1;
    return ans;
}

string read_string ()
{
    string ans = "";
    char c;
    while(isDigit[c = read_char()])
        ans += c;
    return ans;
}

int n;

struct Operation
{
    bool type;
    int k;
    string str;
};

Operation op[N_MAX];

unordered_set <string> us;

vector <int> vd[D_MAX];

vector <int> aux;

int cnt[10];

void radix (vector <int> &v, int d)
{
    aux.resize(v.size());
    for(int i = 0; i <= 9; i++)
        cnt[i] = 0;
    for(int i : v)
    {
        int digit = op[i].str[d] - '0';
        if(digit < 9)
            cnt[digit + 1]++;
    }
    for(int i = 1; i <= 9; i++)
        cnt[i] += cnt[i - 1];
    for(int i : v)
    {
        int digit = op[i].str[d] - '0';
        aux[cnt[digit]++] = i;
    }
    v = aux;
}

void radixSort (vector <int> &v, int d)
{
    for(int i = 0; i < d; i++)
        radix(v, i);
}

vector <int> vsort;

int vn[N_MAX];

int BIT[N_MAX];

void update (int pos)
{
    for(int i = pos; i <= (int)vsort.size(); i += i & -i)
        BIT[i]++;
}

int query (int k)
{
    int ans = 0;
    for(int step = 19; step >= 0; step--)
        if(ans + (1 << step) <= (int)vsort.size() && BIT[ans + (1 << step)] < k)
        {
            ans += (1 << step);
            k -= BIT[ans];
        }
    return ans + 1;
}

int main()
{
    n = read_int();
    for(int i = 1; i <= n; i++)
    {
        op[i].type = read_int();
        if(op[i].type == 0)
            op[i].k = read_int();
        else
        {
            op[i].str = read_string();
            if(us.find(op[i].str) != us.end())
                continue;
            us.insert(op[i].str);
            reverse(op[i].str.begin(), op[i].str.end());
            vd[(int)op[i].str.size()].push_back(i);
        }
    }
    for(int i = 1; i < D_MAX; i++)
        if(vd[i].size() > 0)
        {
            if(vd[i].size() > 1)
                radixSort(vd[i], i);
            for(int j : vd[i])
            {
                vsort.push_back(j);
                vn[j] = vsort.size();
            }
        }
    for(int i = 1; i <= n; i++)
        if(op[i].type == 1)
        {
            if(vn[i] > 0)
                update(vn[i]);
        }
        else
        {
            string s = op[vsort[query(op[i].k) - 1]].str;
            reverse(s.begin(), s.end());
            fout << s << "\n";
        }
    return 0;
}