Cod sursa(job #2120113)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 1 februarie 2018 21:58:24
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <string>
#include <algorithm>

using namespace std;

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

typedef unsigned long long u64;
const int nmax = 1e5;

int n;
vector< string > v;
vector< int > ord;

pair<int, int> op[nmax + 1];

int val[nmax + 1];
int aint[4 * nmax + 1];

inline bool cmp (int a, int b) {
    if (v[ a ].size() != v[ b ].size()) {
        return (v[ a ].size() < v[ b ].size());
    }
    return v[ a ] < v[ b ];
}

void precalc () {
    sort(ord.begin(), ord.end(), cmp);

    for (int i = 0; i < (int)ord.size(); ) {
        int j = i;

        while (j < (int)ord.size() && v[ ord[ i ] ] == v[ ord[ j ] ]) {
            val[ ord[ j ] ] = i + 1;
            ++ j;
        }

        i = j;
    }
}

void update (int nod, int x, int y, int pos) {
    if (x == y) {
        aint[ nod ] = 1;
        return ;
    }

    int mij = (x + y) / 2;
    if (pos <= mij)
        update(2 * nod, x, mij, pos);
    else
        update(2 * nod + 1, mij + 1, y, pos);

    aint[ nod ] = aint[2 * nod] + aint[2 * nod + 1];
}

int query (int nod, int x, int y, int k) {
    if (x == y)
        return x;

    int mij = (x + y) / 2;
    if (k <= aint[2 * nod]) {
        return query(2 * nod, x, mij, k);
    } else {
        return query(2 * nod + 1, mij + 1, y, k - aint[2 * nod]);
    }
}

int main () {
    fin >> n;

    for (int i = 1; i <= n; ++ i) {
        fin >> op[ i ].first;

        if (op[ i ].first == 0) {
            fin >> op[ i ].second;
        } else {
            string x;
            fin >> x;
            v.push_back( x );
            ord.push_back((int)v.size() - 1);
            op[ i ].second = (int)v.size() - 1;
        }
    }

    precalc ();

    for (int i = 1; i <= n; ++ i) {
        if (op[ i ].first == 0) {
            fout << v[ ord[query(1, 1, n, op[ i ].second) - 1] ] << "\n";
        } else {
            update(1, 1, n, val[ op[ i ].second ]);
        }
    }

    fout.close();
    return 0;
}