Cod sursa(job #2188549)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 27 martie 2018 11:04:29
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<algorithm>
#define DIM 100005
#define f first
#define s second
using namespace std;
int m, n, i, p, ii, x, j;
int aib[DIM], v[DIM], poz[DIM];
char s[DIM];
pair<int, int> q[DIM];
vector<char> nr[DIM];
ifstream fin("nums.in");
ofstream fout("nums.out");
void update(int x){
    for(; x <= n; x += (x & -x)){
        aib[x]++;
    }
}
int cmp(int a, int b){
    if(nr[a].size() != nr[b].size()){
        return nr[a].size() < nr[b].size();
    }
    for(int i = 0; i < nr[a].size(); i++){
        if(nr[a][i] != nr[b][i]){
            return nr[a][i] < nr[b][i];
        }
    }
    return a < b;
}
int egal(int a, int b){
    if(nr[a].size() != nr[b].size()){
        return 0;
    }
    for(int i = 0; i < nr[a].size(); i++){
        if(nr[a][i] != nr[b][i]){
            return 0;
        }
    }
    return 1;
}
int main(){
    fin>> m;
    for(i = 1; i <= m; i++){
        fin>> q[i].f;
        if(q[i].f == 0){
            fin>> q[i].s;
            continue;
        }
        fin>> s;
        x = strlen(s);
        n++;
        q[i].s = n;
        for(j = 0; j < x; j++){
            nr[n].push_back(s[j]);
        }
        v[n] = n;
    }
    sort(v + 1, v + n + 1, cmp);
    x = 1;
    for(i = 2; i <= n; i++){
        if(egal(v[i], v[x]) == 0){
            v[++x] = v[i];
        }
    }
    n = x;
    for(i = 1; i <= n; i++){
        poz[ v[i] ] = i;
    }
    for(i = 1; i <= m; i++){
        if(q[i].f == 1){
            if(poz[ q[i].s ] != 0){
                update(poz[ q[i].s ]);
            }
            continue;
        }
        ii = 0;
        p = 1;
        while(p * 2 <= n){
            p *= 2;
        }
        while(p != 0){
            if(ii + p <= n && aib[p + ii] < q[i].s){
                q[i].s -= aib[p + ii];
                ii += p;
            }
            p /= 2;
        }
        ii++;
        for(j = 0; j < nr[ v[ii] ].size(); j++){
            s[j] = nr[ v[ii] ][j];
        }
        s[j] = 0;
        fout<< s <<"\n";
    }
    return 0;
}