Cod sursa(job #2267142)

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

int n, NR;
int a[100005], k[100005], pos[100005], rev[100005];
bool w[100005];
string b;
pair <string, int> s[100005];
map <string, 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 aib[100005];

inline void u(int p){
    for(int i = p; i <= NR ; i += (i & (-i)))
        ++aib[i];
}
inline int q(int p){
    int ans = 0;
    for(int i = p; i > 0 ; i -= (i & (-i)))
        ans = ans + aib[i];
    return ans;
}
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;
            if(f[b] == 0){
                f[b] = 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(pos[a[i]]), w[pos[a[i]]] = 1;
        else if(a[i] == 0){
            int st = 1, dr = NR;
            while(st <= dr){
                int mij = (st + dr) / 2;
                int val = q(mij);
                if(val > k[i] || (val == k[i] && w[mij] == 0)) dr = mij - 1;
                else st = mij + 1;
            }
            while(q(dr) < k[i]) ++dr;
            while(q(dr) == k[i] && w[dr] == 0) --dr;
            fout << s[rev[dr]].first << "\n";
        }
    }



    return 0;
}