Cod sursa(job #2061715)

Utilizator cipri321Marin Ciprian cipri321 Data 9 noiembrie 2017 17:23:41
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <string>
#include <map>
#include <algorithm>
#define DIM 100001
using namespace std;
ifstream fi("nums.in");
ofstream fo("nums.out");
pair<string,int> num[DIM];
pair<int, string> Q[DIM];
map<string,pair<int,int> > U;
int n;
int tip;
int AIB[DIM];
int nru;
int lsb(int x)
{
    return ((x^(x-1))&x);
}
void update(int poz,int val)
{
    for(int i=poz;i<DIM;i+=lsb(i))
        AIB[i]+=val;
}
string query(int poz)
{
    int p=0;
    for(int i=DIM;i>0;i>>=1)
        if(p+i<=nru&&AIB[p+i]<=poz)
            poz-=AIB[p+i],p+=i;
    return num[p].first;
}
bool compar(pair<string,int> a,pair<string,int> b)
{
    if(a.first.size()<b.first.size())
        return true;
    if(a.first.size()>b.first.size())
        return false;
    return a.first<b.first;
}
int numar(string s)
{
    int rez=0;
    for(auto it:s)
        rez=rez*10+(it-'0');
    return rez;
}
int main()
{
    fi>>n;
    for(int i=1;i<=n;i++)
    {
        string s;
        fi>>tip>>s;
        Q[i].first=tip,Q[i].second=s;
        if(tip==1)
            num[++nru].first=s,num[nru].second=i;
    }
    sort(num+1,num+nru+1,compar);
    for(int i=1;i<=nru;i++)
        U[num[i].first]=make_pair(i,0);

    for(int i=1;i<=n;i++)
    {
        if(Q[i].first==1&&U[Q[i].second].second==0)
            update(U[Q[i].second].first,1);
        else
            fo<<query(numar(Q[i].second))<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}