Cod sursa(job #2629822)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 22 iunie 2020 19:16:59
Problema Nums Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
#define DIM 100010
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;

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 main (){

    ifstream cin ("nums.in");
    ofstream cout ("nums.out");

    cin>>n;
    for (i=1;i<=n;i++){
        cin>>tip[i];
        if (tip[i] == 0)
            cin>>w[i];
        else {
            cin>>s[i];
            v[++k] = make_pair(make_pair(s[i].length(),s[i]),i);
        }
    }
    sort (v+1,v+k+1);
    int k2 = 1;
    for (i=2;i<=k;i++)
        if (v[i].first.second != v[i-1].first.second)
            v[++k2] = v[i];
    k = k2;

    for (i=1;i<=k;i++)
        poz[v[i].second] = i;

    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;
            }

            cout<<v[sol].first.second<<"\n";

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

    return 0;
}