Cod sursa(job #1135915)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 8 martie 2014 15:44:53
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>

#define DN 100003
#define INF (1<<30)
using namespace std;


ifstream f("nums.in");
ofstream g("nums.out");

struct operatii{

    int op,k;
};
struct st{
    string nr;
    int ind;
} v[DN];

int sz,arb[4*DN],n,poz,k,S,p[DN];

operatii M[DN];


bool cmp(st a, st b) /// a<b ?
{
    if(a.nr.size() == b.nr.size())
        return a.nr < b.nr;

    return a.nr.size() < b.nr.size();
}

void update(int nod,int left,int right){

    if(left == right){

        ++arb[nod];
        return;
    }
    int mij = ( left + right)>>1;
    if( poz <= mij) update( nod<<1 , left , mij);
        else update( ( (nod<<1) | 1 ),mij+1,right);

    arb[nod] = arb[2*nod] + arb[2*nod+1];
}

void fnd(int nod,int left,int right){

    if(left == right){

        g<<v[left].nr<<"\n";
        return;
    }
    int mij = ( left + right)>>1;
    if( S + arb[2*nod] >= k && arb[2*nod] )
        fnd( nod<<1 , left , mij);
    else{
        S+=arb[2*nod];
        fnd(( (nod<<1) | 1 ),mij+1,right);
    }
}

int main()
{
    int m;
    f>>m;
    for(int i=1;i<=m;++i){

        f>>M[i].op;

        if(M[i].op){
            f>>v[++sz].nr;
            v[sz].ind = sz;
        }
        else
            f>>M[i].k;
    }

    sort(v+1,v+sz+1,cmp);

    for(int i=1;i<=sz;++i){

        int min_ind = v[i].ind , poz = i;
        if(i+1<=sz && v[i].nr == v[i+1].nr){

            ++i;
            for(;v[i].nr == v[i-1].nr &&  i<=sz; ++i)
                min_ind = min(min_ind , v[i].ind);
            --i;
        }
        p[ min_ind ] = poz;
    }

    n = sz;

    for(int i=1,c=0;i<=m;++i){

        if(M[i].op){

            poz = p[ ++c ];
            if( !poz )
                continue;
            update(1,1,n);
        }else{

            k = M[i].k;
            S=0;
            fnd(1,1,n);
        }
    }
    return 0;
}