Cod sursa(job #2629828)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 22 iunie 2020 19:43:54
Problema Nums Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>
#define DIM 100010
#define DIMBUFF 7000000
using namespace std;

string s[DIM];
int tip[DIM],w[DIM],poz[DIM],aib[DIM];
pair <pair<int,string>, int> v[DIM];
int n,k,i,pos;
char buff[DIMBUFF];

void update (int p, int val){
    for (;p<=k;p+=(p&-p))
        aib[p] += val;
}
int query (int p){
    int sol = 0;
    for (;p;p-=(p&-p))
        sol += aib[p];
    return sol;
}

int get_nr (){
    while (!(buff[pos] >= '0' && buff[pos] <= '9'))
        ++pos;
    int nr = 0;
    while (buff[pos] >= '0' && buff[pos] <= '9'){
        nr = nr * 10 + buff[pos] - '0';
        ++pos;
    }
    return nr;
}

int main (){

    FILE *fin = fopen ("nums.in","r");
    ofstream fout ("nums.out");

    fread (buff,1,DIMBUFF,fin);

    n = get_nr();
    for (i=1;i<=n;++i){
        tip[i] = get_nr();
        if (tip[i] == 0)
            w[i] = get_nr();
        else {
            ++pos;
            while (buff[pos] >= '0' && buff[pos] <= '9'){
                s[i].push_back(buff[pos]);
                ++pos;
            }
            //cin>>s[i];
            v[++k] = make_pair(make_pair(s[i].length(),s[i]),i);
        }
    }
    sort (v+1,v+k+1);

    int k2 = 1;
    poz[v[1].second] = 1;
    for (i=2;i<=k;++i)
        if (v[i].first.second != v[i-1].first.second){
            ++k2;
            poz[v[i].second] = k2;
        }

    k = k2;


    for (i=1;i<=n;++i){
        if (tip[i] == 0){
            int val = w[i];
            int st = 1, dr = k, sol = 0;
            while (st <= dr){
                int mid = (st+dr)>>1;
                if (query(mid) >= val){
                    sol = mid;
                    dr = mid-1;
                } else st = mid+1;
            }

            fout<<v[sol].first.second<<"\n";
            //fprintf(fout,"%s\n",v[sol].first.second);

        } else {
            if (poz[i])
                update (poz[i],1);
        }
    }

    return 0;
}