Cod sursa(job #2176003)

Utilizator DavidLDavid Lauran DavidL Data 16 martie 2018 20:22:40
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <string>
#include <algorithm>
#include <map>
#define MAX 100005
using namespace std;
ifstream fi("nums.in");
ofstream fo("nums.out");

int n;
int A[MAX];
string query[MAX];
string aux[MAX];
int k;
int q[MAX];
map <string,int> cor;

bool cmp(string &a,string &b)
{
    int la=a.size();
    int lb=b.size();
    if (la>lb)
        return 0;
    if (la<lb)
        return 1;
    for (int i=0; i<la; i++)
        if (a[i]<b[i])
            return 1;
        else if (a[i]>b[i])
            return 0;
    return 1;
}

void update(int poz,int val)
{
    for (int i=poz; i<MAX; i+=(i&(-i)))
        A[i]+=val;
}

int sum(int poz)
{
    int rez=0;
    for (int i=poz; i>0; i-=(i&(-i)))
        rez+=A[i];
    return rez;
}

string qquery(int aaa)
{
    int step,pos=0;
    step=65536;
    for(; step; step>>=1)
        if(pos+step<=k)
            if(A[pos+step]<=aaa)
            {
                pos+=step;
                aaa-=A[pos];
            }

    return query[pos];
}

int main()
{
    fi>>n;
    for (int i=1,adev=1; i<=n && adev<=n; i++,adev++)
    {
        int p;
        fi>>p;
        if (p==0)
        {
            fi>>q[adev];
        }
        else
        {
            string x;
            fi>>x;
            //if (!cor[x])
            //{
                query[++k]=x;
                aux[k]=query[k];
                cor[x]=1;
            //}
            //else
                //adev--;
        }
    }

    sort(query+1,query+k+1,cmp);

    for (int i=1; i<=k; i++)
        cor[query[i]]=i;

    int ajuns=0;
    int maxim;
    for (int i=1; i<=n; i++)
    {
        if (q[i]==0) /// nr nou
        {
            ajuns++;
            int poz=cor[aux[ajuns]];
            maxim=max(poz,maxim);
            update(poz,1);
        }
        else /// query
        {
            fo<<qquery(q[i])<<"\n";
        }
    }

    return 0;
}