Pagini recente » Cod sursa (job #1136363) | Cod sursa (job #2190062) | Cod sursa (job #2408745) | Cod sursa (job #1403180) | Cod sursa (job #2748625)
#include <bits/stdc++.h>
#define op(x) (x^(x-1))&x
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
int n,nr=0,tr=0,aib[100005];
int tip;
bool activ[100005];
string s;
map<string,int> poz;
struct operations
{
int mod;
string sir;
} v[100005];
struct numere
{
string sir;
} elem[100005];
bool cmp(numere a,numere b)
{
if( a.sir.size()==b.sir.size() )
return a.sir<b.sir;
return a.sir.size()<b.sir.size();
}
void adauga(int loc)
{
for(int i=loc; i<=tr; i+=op(i)) aib[i]++;
}
int sum(int loc)
{
int suma=0;
for(int i=loc; i>=1; i-=op(i)) suma+=aib[i];
return suma;
}
int main()
{
f>>n;
while(n--)
{
f>>tip;
f>>s;
nr++;
v[nr].mod=tip;
v[nr].sir=s;
if(tip==1)
{
tr++;
elem[tr].sir=s;
}
}
sort(elem+1,elem+tr+1,cmp);
int cpy=tr;
tr=0;
for(int i=1; i<=cpy; i++)
{
if(elem[tr].sir!=elem[i].sir) elem[++tr].sir=elem[i].sir;
}
for(int i=1; i<=tr; i++)
{
poz[elem[i].sir]=i;
}
for(int i=1; i<=nr; i++)
{
if( v[i].mod==1 )
{
int loc=poz[v[i].sir];
if(activ[loc]==1) continue;
adauga(loc);
activ[loc]=1;
continue;
}
string s=v[i].sir;
int k=0;
for(int j=0; j<s.size(); j++)
k=k*10+s[j]-'0';
int st=1,dr=tr,mid,rasp=0;
while(st<=dr)
{
int mid=(st+dr)/2;
if(sum(mid)>=k) rasp=mid,dr=mid-1;
else st=mid+1;
}
g<<elem[rasp].sir<<'\n';
}
}