Pagini recente » Monitorul de evaluare | Cod sursa (job #2081413) | Cod sursa (job #1467081) | Cod sursa (job #2655510) | Cod sursa (job #779790)
Cod sursa(job #779790)
#include <fstream>
#include <tr1/unordered_map>
#include <algorithm>
#include <vector>
#define NM 100010
#define t first
#define n second
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
typedef pair<int, string> OP;
tr1::unordered_map<string, int> M;
vector<int> IND;
int N,i,j,P,AI[4*NM],K;
OP O[NM];
bool In[NM];
bool CompareString (const int& a, const int& b)
{
return (O[a].n.size()!=O[b].n.size()?O[a].n.size()<O[b].n.size():O[a].n<O[b].n);
}
void Update (int nod, int S, int F)
{
if (S>=F)
{
AI[nod]=1;
return;
}
int M=(S+F)/2;
if (P<=M)
Update(2*nod,S,M);
else
Update(2*nod+1,M+1,F);
AI[nod]=AI[2*nod]+AI[2*nod+1];
}
int Query (int nod, int S, int F)
{
if (S>=F)
return S;
int M=(S+F)/2;
if (K<=AI[2*nod])
return Query(2*nod,S,M);
else
{
K-=AI[2*nod];
return Query(2*nod+1,M+1,F);
}
return 0;
}
int main ()
{
f >> N;
for (i=1; i<=N; i++)
{
f >> O[i].t >> O[i].n;
if (O[i].t==1)
IND.push_back(i);
}
sort(IND.begin(),IND.end(),CompareString);
for (i=1; i<IND.size(); i++)
M[O[IND[i]].n]=i+1;
for (i=1; i<=N; i++)
if (O[i].t==1)
{
P=M[O[i].n];
if (In[P]) continue;
Update(1,1,IND.size());
In[P]=1;
}
else
{
K=0;
for (j=0; j<O[i].n.size(); j++)
K=K*10+O[i].n[j]-'0';
P=Query(1,1,IND.size());
g << O[IND[P-1]].n << '\n';
}
f.close();
g.close();
return 0;
}