Cod sursa(job #1661612)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 24 martie 2016 00:06:22
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <bitset>
#include <stack>
#include <iomanip>
#define MOD 1000000000
#define NMAX 100005
#define INF 0x3f3f3f3f
#define pb push_back

using namespace std;

typedef pair<int, int> pii;

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

int op[NMAX], nrOrd[NMAX], aib[NMAX], q[NMAX], n, pos[NMAX];
pair<string, int> s[NMAX];
bool used[NMAX];

inline bool comp(pair<string, int> A, pair<string, int> B) {
    if(A.first.size() == B.first.size())
        return A.first<B.first;

    return A.first.size() < B.first.size();
}

inline int lsb(int x) { return ((x&(x-1))^x); }

inline void update_aib(int pos) {
    while(pos<=n) {
        ++aib[pos];
        pos+=lsb(pos);
    }
}

inline int query_aib(int pos) {
    int res=0,i=1;

    while((1<<i)<=n) i<<=1;

    while(i>0) {
        if((res|i)<=n) {
            if(aib[res|i]<pos) {
                res|=i;
                pos-=aib[res];
            }
        }

        i>>=1;
    }

    return res+1;
}

int main() {
    int i,nrCuv=0;

    fin>>n;

    for(i=1;i<=n;++i) {
        fin>>op[i];

        if(op[i] == 1) {
            fin>>s[++nrCuv].first;
            s[nrCuv].second=i;
        }
        else fin>>q[i];
    }

    sort(s+1,s+nrCuv+1,comp);

    for(i=1;i<=nrCuv;++i) {
        if(s[i].first == s[i-1].first)
            nrOrd[s[i].second]=nrOrd[s[i-1].second];
        else nrOrd[s[i].second]=nrOrd[s[i-1].second]+1;
        pos[nrOrd[s[i].second]]=i;
    }

    for(i=1;i<=n;++i) {
        if(op[i] == 1) {
            if(!used[nrOrd[i]]) {
                used[nrOrd[i]] = 1;
                update_aib(nrOrd[i]);
            }
        } else fout<<s[pos[query_aib(q[i])]].first<<'\n';
    }

    return 0;
}