Cod sursa(job #1735031)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 28 iulie 2016 18:11:07
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<fstream>
#include<algorithm>
#include<string>
#define MAXN 100010
using namespace std;
int query[MAXN],aib[MAXN],seen[MAXN];
string s[MAXN],sn[MAXN],sf[MAXN];
bool Compare(string a,string b){
    if(a.size()!=b.size())
        return a.size()<b.size();
    return a<b;
}
int main(){
    ifstream fin("nums.in");
    ofstream fout("nums.out");
    int i,j,n,type,strings=0,different=1,step,answer,before;
    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&&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&&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;
}