Cod sursa(job #2690421)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 23 decembrie 2020 22:14:17
Problema Nums Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

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

const int NMax = 1e5;

struct number{
    int len;
    int poz;
    string s;
};

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

bool compare(number A, number B) {
    if(A.len != B.len)
        return A.len < B.len;

    return A.s < B.s;
}

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.length(), i, S});
        } else {
            fin >> k;
            Q[i] = k;
        }
    }
    sort(V.begin(), V.end(), compare);

    for(int i = 0; i < V.size(); ++i) {
        if(i == 0 || V[i].s != V[i - 1].s)
            V[N++] = V[i];
    }

    for(int i = 0; i < N; i++) {
        norm[V[i].poz] = i + 1;
        getNumber[i + 1] = V[i].s;
    }

    for(int i = 1; i <= T; i++) {
        if(Q[i] == 0) {
            if(!use[norm[i]])
                updateAIB(norm[i]);

            use[norm[i]] = true;
        } 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 << getNumber[sol + 1] << '\n';
        }
    }
    return 0;
}