Cod sursa(job #1953670)

Utilizator mariakKapros Maria mariak Data 4 aprilie 2017 22:30:40
Problema Nums Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
/*  Input : insert strings
            query find k-th string in lexicographical order

    Solution :

*/
#include <bits/stdc++.h>
#define maxN 100002
#define zeros(x) x&(-x)

FILE *fin  = freopen("nums.in", "r", stdin);
FILE *fout = freopen("nums.out", "w", stdout);

using namespace std;
int Q, m;
string str;
struct Elem{
    string s;
    int idx;
} e[maxN];

int cmp(const Elem a, const Elem b){
    if (a.s.size() == b.s.size())
        return a.s < b.s;
    return a.s.size() < b.s.size();
}

struct Query{
    int t, kth, pos;
} q[maxN];

bool used[maxN];
int aib[maxN];

void update(int pos){
    for(int i = pos; i <= Q; i += zeros(i))
        aib[i] += 1;
}

void query(int pos){
    int ans = 0;
    for(int i = pos; i > 0; i -= zeros(i))
        ans += aib[i];
}

int kthElement(int k){
    int i = 0, p = 1 << 16;
    while(p){
        if(i + p <= Q && aib[i + p] < k){
            i += p;
            k -= aib[i];
        }
        p >>= 1;
    }
    return i + 1;
}

void queries(){
    for(int i = 1; i <= Q; ++ i){
        if(q[i].t && !used[q[i].pos]){
            update(q[i].pos);
            used[q[i].pos] = 1;
        }
        if(!q[i].t){
            int pos = kthElement(q[i].kth);
            cout << e[pos].s;
            printf("\n");
        }
    }
}

int main(){
    /*------Read Input----*/
    scanf("%d", &Q);
    for(int i = 1; i <= Q; ++ i){
        scanf("%d ", &q[i].t);
        if(q[i].t){
            ++ m;
            cin >> e[m].s;
            e[m].idx = i;
        }
        else scanf("%d", &q[i].kth);
    }

    /*-----MyNorm---------*/
    sort(e + 1, e + m + 1, cmp);
    for(int i = 1; i <= m; ++ i){
        int j = i;
        while(e[i].s == e[j].s && j <= m){
            q[e[j].idx].pos = i;
            ++ j;
        }
        i = j - 1;
    }
    queries();
    return 0;
}