Cod sursa(job #809814)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 9 noiembrie 2012 02:51:45
Problema Nums Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("nums.in");
#define LE 106000
ofstream g("nums.out");
string S[LE];
int tip[LE],Q[LE],pos[LE],L[LE];
int i,n;
int ind[LE];
int Arb[LE*6];
int n2;

int comp(int A,int B)
{
    if (L[A]<L[B])
        return true;
    if (L[A]>L[B])
        return false;

    int N=L[A];

    for(i=0; i<N; ++i)
    {
        if (S[A][i]<S[B][i])
            return true;

        if (S[A][i]>S[B][i])
            return false;
    }

    return false;
}

void update(int st,int dr,int value,int nod)
{
    int mij=(st+dr)/2;
    ++Arb[nod];

    if (st==dr)
        return ;

    if (value<=mij)
        update(st,mij,value,nod*2);
    else update(mij+1,dr,value,nod*2+1);
}

int query(int st,int dr,int nod,int DR)
{
    int mij=(st+dr)/2;



    if (dr<=DR)
        return Arb[nod];

    if (mij+1>DR)
        return query(st,mij,nod*2,DR);

    return query(st,mij,nod*2,DR)+query(mij+1,dr,nod*2+1,DR);
}

int BS(int value)
{
    int step,pos;

    for(step=1; step<=n2; step*=2);

    for(pos=0; step; step/=2)
        if (pos+step<=n2&&query(1,n2,1,pos+step)<value)
            pos+=step;

    return pos+1;
}
int main()
{
    f>>n;
    int k=0;

    for(i=1; i<=n; ++i)
    {
        f>>tip[i];

        if (tip[i]==0)
            f>>Q[i];

        if (tip[i]==1)
        {
            f>>S[++k];
            L[k]=S[k].length();

            Q[i]=k;
        }
    }

    n2=k;

    for(i=1; i<=n2; ++i)
        ind[i]=i;

    sort(ind+1,ind+n2+1,comp);

    for(i=1; i<=n2; ++i)
        pos[ind[i]]=i;


    for(i=1; i<=n; ++i)
    {
        if (tip[i]==1)
            update(1,n2,pos[Q[i]],1);

        if (tip[i]==0)
        {
            int p=ind[BS(Q[i])];
            int N=S[p].length();

            for(int j=0; j<N; ++j)
                g<<S[p][j];

            g<<'\n';
        }
    }


    f.close();
    g.close();
    return 0;
}