Cod sursa(job #1965634)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 14 aprilie 2017 15:25:42
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#define nmax 100010

using namespace std;

ifstream fin("nums.in");
ofstream fout("nums.out");
int i,j,n,type,strings=0,different=1,step,answer,before;
int query[nmax],aib[nmax],seen[nmax];
string s[nmax],sn[nmax],sf[nmax];

bool Compare(string a,string b){
    if(a.size()!=b.size())
        return a.size()<b.size();
    return a<b;
}
int main()
{
    fin >> n;
    for(i=1;i<=n;i++){
        fin >> type;
        if(type==0)
            fin >> query[i];
        else{
            fin >> s[i];
            strings++;
            sn[strings]=s[i];
        }
    }
    sort(sn+1,sn+strings+1,Compare);
    sf[1]=sn[1];
    for(i=2;i<=strings;i++)
    if(sn[i]!=sn[i-1]){
        different++;
        sf[different]=sn[i];
    }
    for(i=1;i<=n;i++)
        if(query[i]!=0){
            answer=before=0;
            for(step=(1<<16);step>0;step/=2)
                if(answer+step<different and before+aib[answer+step]<query[i]){
                    before+=aib[answer+step];
                    answer+=step;
                }
            fout << sf[answer+1]<<'\n';
        }
        else{
            answer=0;
            for(step=(1<<16);step>0;step/=2)
                if(answer+step<=different and Compare(s[i],sf[answer+step])==0)
                    answer+=step;
            if(seen[answer]==0){
                seen[answer]=1;
                for(j=answer;j<=different;j=j+((j&(j-1))^j))
                    aib[j]++;
            }
        }
    return 0;
}