Pagini recente » Cod sursa (job #2880137) | Cod sursa (job #493194) | Cod sursa (job #1070107) | Cod sursa (job #2408777) | Cod sursa (job #793981)
Cod sursa(job #793981)
#include <fstream>
#include <tr1/unordered_map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
#define leftSon (node << 1)
#define rightSon ((node << 1) + 1)
#define PIS pair<int, string>
#define nmax 100010
#define t first
#define n second
ifstream in("nums.in");
ofstream out("nums.out");
tr1 :: unordered_map<string, int> M;
vector<int> ind;
int N, P, K, Aint[4 * nmax];
PIS now[nmax];
bool In[nmax];
bool cmp(int i, int j)
{
if(now[i].n.size() != now[j].n.size())
return now[i].n.size() < now[j].n.size();
return now[i].n < now[j].n;
}
void Update(int node, int left, int right)
{
if(left == right)
{
Aint[node] = 1;
return ;
}
int mid = (left + right) / 2;
if(P <= mid) Update(leftSon, left, mid);
else Update(rightSon, mid + 1, right);
Aint[node] = Aint[leftSon] + Aint[rightSon];
}
int Query(int node, int left, int right)
{
if(left >= right) return left;
int mid = (left + right) / 2;
if(K <= Aint[leftSon]) return Query(leftSon, left, mid);
else
{
K -= Aint[leftSon];
return Query(rightSon, mid + 1, right);
}
return 0;
}
int main()
{
int i, j;
in >> N;
for(i = 1; i <= N; i++)
{
in >> now[i].t >> now[i].n;
if(now[i].t == 1) ind.push_back(i);
}
sort(ind.begin(), ind.end(), cmp);
for(i = 1; i < ind.size(); i++)
M[now[ind[i]].n] = i + 1;
for(i = 1; i <= N; i++)
{
if(now[i].t == 1)
{
P = M[now[i].n];
if(In[P]) continue;
Update(1, 1, ind.size());
In[P] = 1;
}else
{
K = 0;
for(j = 0; j < now[i].n.size(); j++)
K = K * 10 + now[i].n[j] - '0';
P = Query(1, 1, ind.size());
out << now[ind[P - 1]].n << "\n";
}
}
return 0;
}