Cod sursa(job #2163047)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 12 martie 2018 16:33:24
Problema Nums Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <map>

using namespace std;

struct str1
{
    int tip,poz;
}q[100010];

struct str
{
    int poz;
    string s;
}v[100010];

int aib[100010],logn,n;
map<string,bool> mp;

void update(int poz)
{
    for(;poz<=n;poz+=poz&(-poz))
        aib[poz]++;
}

int caut_bin(int val)
{
    int poz=0;
    for(int i=logn;i>=0;i--)
        if(poz+(1<<i)<=n && aib[poz+(1<<i)]<val)
        {
            poz+=(1<<i);
            val-=aib[poz];
        }
    return poz+1;
}

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

int main()
{
    ifstream f("nums.in");
    ofstream g("nums.out");
    int l=0;
    string s;
    f>>n;
    while((1<<logn)<=n) logn++;
    logn--;
    for(int i=1;i<=n;i++)
    {
        f>>q[i].tip;
        if(q[i].tip==1)
        {
            f>>s;
            if(mp[s]==1) continue;
            mp[s]=1;
            v[++l].s=s;
            v[l].poz=i;
        }
        else f>>q[i].poz;
    }
    sort(v+1,v+l+1,cmp);
    for(int i=1;i<=l;i++)
        q[v[i].poz].poz=i;
    for(int i=1;i<=n;i++)
        if(q[i].tip==1)
        {
            if(q[i].poz!=0) update(q[i].poz);
        }
        else g<<v[caut_bin(q[i].poz)].s<<"\n";
    return 0;
}