Cod sursa(job #2267717)

Utilizator giotoPopescu Ioan gioto Data 23 octombrie 2018 22:12:08
Problema Nums Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
using namespace std;

const int MOD1 = 100007;
const int MOD2 = 100021;

int n, NR;
int a[100005], k[100005], pos[100005], rev[100005];
bool w[100005];
string b;
pair <string, int> s[100005];
map <pair <int, int>, int> f;

inline bool cmp(pair <string, int> x, pair <string, int> y){
    if((x.first).size() != (y.first).size()) return (x.first).size() < (y.first).size();
    return x.first < y.first;
}

int Arb[400005];

void u(int st, int dr, int nod, int p){
    if(st == dr){++Arb[nod]; return ;}

    int mij = (st + dr) / 2;
    if(p <= mij) u(st, mij, nod * 2, p);
    else u(mij + 1, dr, nod * 2 + 1, p);
    Arb[nod] = Arb[nod * 2] + Arb[nod * 2 + 1];
}
int q(int st, int dr, int nod, int val){
    if(st == dr) return st;

    int mij = (st + dr) / 2;
    if(Arb[nod * 2] >= val) return q(st, mij, nod * 2, val);
    else return q(mij + 1, dr, nod * 2 + 1, val - Arb[nod * 2]);
}
int main()
{
    ifstream fin("nums.in");
    ofstream fout("nums.out");

    fin >> n;
    for(int i = 1; i <= n ; ++i){
        fin >> a[i];
        if(a[i] == 1){
            fin >> b;

            int H1 = 0, H2 = 0;
            for(auto it : b){
                H1 = (H1 * 10 + it - '0') % MOD1;
                H2 = (H2 * 10 + it - '0') % MOD2;
            }

            if(f[{H1, H2}] == 0){
                f[{H1, H2}] = 1;
                ++NR;
                s[NR] = {b, NR};
                a[i] = NR;
            }
            else a[i] = -1;
        }
        else fin >> k[i];
    }

    sort(s + 1, s + NR + 1, cmp);
    for(int i = 1; i <= NR ; ++i) pos[s[i].second] = i, rev[pos[s[i].second]] = i;


    for(int i = 1; i <= n ; ++i){
        if(a[i] >= 1) u(1, NR, 1, pos[a[i]]), w[pos[a[i]]] = 1;
        else if(a[i] == 0){
            int pos = q(1, NR, 1, k[i]);
            fout << s[rev[pos]].first << "\n";
        }
    }



    return 0;
}