Cod sursa(job #2298796)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 8 decembrie 2018 15:22:11
Problema Nums Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 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;
	
}