Cod sursa(job #2690395)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 23 decembrie 2020 21:13:42
Problema Nums Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>

#define pp pair<string, int>

using namespace std;

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

const int NMax = 1e5;

string S, number[NMax + 5];
vector <pp> V;
int norm[NMax + 5], Q[NMax + 5], AIB[NMax + 5], T, N, t, k;

bool compare(pp A, pp B) {
    if(A.first.length() != B.first.length())
        return A.first.length() < B.first.length();

    return A.first < B.first;
}

bool equalFunc(pp A, pp B) {
    return A.first == B.first;
}

void updateAIB(int poz) {
    for(int i = poz; i <= N; i += (i & (-i)))
        AIB[i]++;
}

int queryAIB(int poz) {
    int sum = 0;

    for(int i = poz; i > 0; i -= (i & (-i)))
        sum += AIB[i];

    return sum;
}

int main()
{
    fin >> T;

    for(int i = 1; i <= T; ++i) {
        fin >> t;

        if(t == 1) {
            fin >> S;
            V.push_back({S, i});
        } else {
            fin >> k;
            Q[i] = k;
        }
    }
    sort(V.begin(), V.end(), compare);
    V.resize(distance(V.begin(), unique(V.begin(), V.end(), equalFunc)));

    for(auto x : V) {
        norm[x.second] = ++N;
        number[N] = x.first;
    }

    for(int i = 1; i <= T; i++) {
        if(Q[i] == 0) {
            updateAIB(norm[i]);
        } else {
            int sol = 0;

            for(int step = (1 << 16); step > 0; step >>= 1) {
                if(sol + step <= N && queryAIB(sol + step) < Q[i])
                    sol += step;
            }
            fout << number[sol + 1] << '\n';
        }
    }
    return 0;
}