Cod sursa(job #1838238)

Utilizator LucianTLucian Trepteanu LucianT Data 31 decembrie 2016 15:11:36
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
/// ...
#include <bits/stdc++.h>
#define maxN 100005
#define maxLog 16
#define lsb(x) ((x)&(-x))
using namespace std;
string num[maxN],str[maxN],_input[maxN];
int n,nrs,nrdif,i,op,pos,sol,sum,step;
int qry[maxN],aib[maxN];
bool seen[maxN];
bool cmp(const string &a,const string &b)
{
    if(a.size()==b.size())
        return a<b;
    return a.size()<b.size();
}
void update(int pos,int val)
{
    for(int i=pos;i<=nrdif;i+=lsb(i))
        aib[i]+=val;
}
int main()
{
    ifstream f("nums.in");
    ofstream g("nums.out");
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>op;
        if(!op)
            f>>qry[i];
        else f>>_input[i],num[++nrs]=_input[i];
    }
    sort(num+1,num+nrs+1,cmp);
    str[++nrdif]=num[1];
    for(i=2;i<=nrs;i++)
        if(num[i]!=num[i-1])
            str[++nrdif]=num[i];
    for(i=1;i<=n;i++)
    {
        if(!qry[i])
        {
            pos=0;
            for(step=1<<maxLog;step>0;step>>=1)
                if(pos+step<=nrdif && cmp(_input[i],str[pos+step])==0)
                    pos+=step;
            if(!seen[pos])
                update(pos,1),
                seen[pos]=true;
        }
        else
        {
            sol=sum=0;
            for(step=1<<maxLog;step>0;step>>=1)
                if(sol+step<nrdif && sum+aib[sol+step]<qry[i])
                    sol+=step,sum+=aib[sol];
            g<<str[sol+1]<<'\n';
        }
    }
    return 0;
}