Cod sursa(job #2162898)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 12 martie 2018 15:34:48
Problema Nums Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>

using namespace std;

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

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

int aib[100010],logn,n;
char vaz[100010];

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

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;
    return a.s.size()<b.s.size();
}

int main()
{
    ifstream f("nums.in");
    ofstream g("nums.out");
    int l=0;
    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>>v[++l].s;
            v[l].poz=i;
        }
        else f>>q[i].poz;
    }
    sort(v+1,v+l+1,cmp);
    q[v[1].poz].poz=1;
    for(int i=2;i<=l;i++)
        if(v[i].s==v[i-1].s) q[v[i].poz].poz=q[v[i-1].poz].poz;
        else q[v[i].poz].poz=i;
    for(int i=1;i<=n;i++)
        if(q[i].tip==1 && vaz[q[i].poz]==0) {vaz[q[i].poz]=1;update(q[i].poz);}
        else if(q[i].tip==0)
        {
            int poz=caut_bin(q[i].poz);
            g<<v[poz].s<<"\n";
        }
    return 0;
}