Cod sursa(job #1679164)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 7 aprilie 2016 18:41:15
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <algorithm>
#include <string>
#include <vector>
#include <utility>

using namespace std;

const int LMAX = 100005;
struct query {
    bool type;
    int k;
    int nr_str;
} queries[LMAX];

bool _less(const pair <string, int> &a, const pair <string, int> &b) {
    if (a.first.size() != b.first.size())
        return a.first.size() < b.first.size();
    return a.first < b.first;
}

bool _equal(const pair <string, int> &a, const pair <string, int> &b) {
    return a.first == b.first;
}

vector <pair <string, int> > v;

int aib[LMAX];

#define lsb(x) ((x) & (-(x)))

void update(int pos) {
    for (; pos <= v.size(); pos += lsb(pos))
        ++ aib[pos];
}

int binary_search(int k) {
    int pos = 0;

    for (int i = 16; i >= 0; -- i)
        if (pos + (1 << i) <= v.size() && aib[pos + (1 << i)] < k) {
            pos += (1 << i);
            k -= aib[pos];
        }

    return pos;
}

int main()
{
    ifstream cin("nums.in");
    ofstream cout("nums.out");

    int n = 0;
    cin >> n;

    string str;
    for (int i = 1; i <= n; ++ i) {
        cin >> queries[i].type;
        if (!queries[i].type)
            cin >> queries[i].k;
        else {
            cin >> str;
            v.push_back(make_pair(str, i));
        }
    }

    stable_sort(v.begin(), v.end(), _less);
    v.resize(unique(v.begin(), v.end(), _equal) - v.begin());

    for (int i = 0; i < v.size(); ++ i)
        queries[v[i].second].nr_str = i + 1;

    for (int i = 1; i <= n; ++ i)
        if (!queries[i].type)
            cout << v[binary_search(queries[i].k)].first << '\n';
        else if (queries[i].nr_str)
            update(queries[i].nr_str);

    cin.close();
    cout.close();
    return 0;
}