Cod sursa(job #2583137)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 17 martie 2020 19:54:56
Problema Nums Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <string>
#include <algorithm>

using namespace std;

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

const int NMAX = 100000;

int N;

bool type[NMAX + 2];
int kth[NMAX + 2];

int nrStrings;
pair < int, pair < string, int > > strings[NMAX + 2];

int label[NMAX + 2];

///AINT///

struct Aint
{
    int v[4 * NMAX];

    void Update(int node, int st, int dr, int pos)
    {
        if(st == dr)
        {
            v[node]++;
            return;
        }

        int mid = (st + dr) >> 1;

        if(pos <= mid)
            Update(2 * node, st, mid, pos);
        else
            Update(2 * node + 1, mid + 1, dr, pos);

        v[node] = v[2 * node] + v[2 * node + 1];
    }

    int Query(int node, int st, int dr, int cant)
    {
        if(st == dr)
            return st;

        int mid = (st + dr) >> 1;

        if(cant <= v[2 * node])
            return Query(2 * node, st, mid, cant);

        return Query(2 * node + 1, mid + 1, dr, cant - v[2 * node]);
    }
};

Aint aint;

///AINT///

int main()
{
    fin >> N;

    for(int i = 1; i <= N; i++)
    {
        fin >> type[i];

        if(type[i] == 0)
            fin >> kth[i];
        else
        {
            ++nrStrings;
            fin >> strings[nrStrings].second.first;
            strings[nrStrings].first = strings[nrStrings].second.first.size();
            strings[nrStrings].second.second = i;
        }
    }

    sort(strings + 1, strings + nrStrings + 1);

    for(int i = 1; i <= nrStrings; i++)
        if(strings[i].second.first != strings[i - 1].second.first)
            label[strings[i].second.second] = i;

    for(int i = 1; i <= N; i++)
    {
        if(type[i] == 0)
        {
            int p = aint.Query(1, 1, N, kth[i]);
            fout << strings[p].second.first << '\n';
        }
        else
        {
            if(label[i] > 0)
                aint.Update(1, 1, N, label[i]);
        }
    }

    return 0;
}