Pagini recente » Cod sursa (job #3143242) | Cod sursa (job #2252913) | Cod sursa (job #911804) | Cod sursa (job #2840368) | Cod sursa (job #2163541)
#include <fstream>
#include <string>
#include <algorithm>
#include <map>
#define MAX 100005
using namespace std;
ifstream fi("nums.in");
ofstream fo("nums.out");
int n;
int A[MAX];
string query[MAX];
string aux[MAX];
int k;
int q[MAX];
map <string,int> cor;
bool cmp(string a,string b)
{
if (a.size()>b.size())
return 0;
if (a.size()<b.size())
return 1;
for (int i=0; i<a.size(); i++)
if (a[i]<b[i])
return 1;
else if (a[i]>b[i])
return 0;
return 1;
}
void update(int poz,int val)
{
for (int i=poz; i<=n; i+=(i&(-i)))
A[i]+=val;
}
int sum(int poz)
{
int rez=0;
for (int i=poz; i>0; i-=(i&(-i)))
rez+=A[i];
return rez;
}
int main()
{
fi>>n;
for (int i=1; i<=n; i++)
{
int p;
fi>>p;
if (p==0)
{
fi>>q[i];
}
else
{
string x;
fi>>x;
if (!cor[x])
{
query[++k]=x;
aux[k]=query[k];
cor[x]=1;
}
}
}
sort(query+1,query+k+1,cmp);
for (int i=1; i<=k; i++)
cor[query[i]]=i;
/*for (auto x: cor)
fo<<x.first<<": "<<x.second<<"\n";
return 0;*/
int ajuns=0;
for (int i=1; i<=n; i++)
{
if (q[i]==0) /// nr nou
{
ajuns++;
int poz=cor[aux[ajuns]];
update(poz,1);
}
else /// query
{
int st=0,dr=n;
while (dr-st>1)
{
int mij=(st+dr)/2;
if (sum(mij)<q[i])
st=mij;
else
dr=mij;
}
string rez=query[dr];
fo<<rez<<"\n";
}
}
return 0;
}