Pagini recente » Cod sursa (job #219693) | Cod sursa (job #1579858) | Cod sursa (job #2858263) | Cod sursa (job #554732) | Cod sursa (job #811339)
Cod sursa(job #811339)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
string s;
int m, x, arb[500010], sol, t[100010], n, q[100010], ind[100010], a[100010], p[100010], k;
bool used[100010];
string v[100010];
bool cmp(int a, int b)
{
if(v[a].length() == v[b].length()) return v[a] < v[b];
return v[a].length()< v[b].length();
}
void add(int nod, int l, int r)
{
arb[nod]++;
if(l == r) return;
m = (l+r)/2;
if(x <= m)
{
add(nod*2, l, m);
arb[nod*2+1]++;
}
else add(nod*2+1, m+1, r);
}
void search(int nod, int l, int r)
{
if(l == r)
{
sol = l;
return;
}
m = (l+r)/2;
if(arb[2*nod] >= x) search(nod*2, l, m);
else
{
x -= arb[nod*2];
search(nod*2+1, m+1, r);
}
}
int main()
{
int i, j;
ifstream fi("nums.in");
ofstream fo("nums.out");
fi >> n;
for(i = 1; i <= n; i++)
{
fi >> t[i];
if(t[i] == 0) fi >> q[i]; else
{
fi >> s;
v[++k] = s;
ind[k] = k;
p[k] = i;
}
}
sort(ind+1, ind+k+1, cmp);
v[0] = "";
for(i = 1; i <= k; i++)
{
if(v[ind[i]]==v[ind[i-1]]) a[p[ind[i]]] = a[p[ind[i-1]]]; else
a[p[ind[i]]] = i;
}
for(i = 1; i <= n; i++)
if(t[i] == 0)
{
x = q[i];
search(1, 1, k);
j = 0;
fo << v[ind[sol]] << "\n";
}
else
{
x = a[i];
if(used[x]) continue;
used[x] = 1;
add(1, 1, k);
}
return 0;
}