Pagini recente » Cod sursa (job #1159844) | Cod sursa (job #2011117) | Cod sursa (job #1630705) | Cod sursa (job #1049302) | Cod sursa (job #2020540)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <map>
using namespace std;
ifstream f ("nums.in");
ofstream g ("nums.out");
const int Dim = 1e5 + 5;
int aib[ Dim ], c[ Dim ];
int n, nr, m, type;
string s;
map <string, bool> mp;
struct str1 {
int val, nr;
} q[ Dim ];
struct str {
int pos;
string s;
} v[ Dim ];
bool cmp (str a, str b) {
return a.s.size() < b.s.size () || (a.s.size() == b.s.size() && a.s < b.s);
}
int query (int pos) {
int ans = 0;
while (pos >= 1) {
ans += aib[pos];
pos -= pos & (pos ^ (pos - 1));
}
return ans;
}
void update (int pos, int val) {
while (pos <= n) {
aib[pos] += val;
pos += pos & (pos ^ (pos - 1));
}
}
int cbin (int val) {
int i, p = 0;
for (i = 1; i <= n; i <<= 1);
while (i) {
if (i + p <= n && query (i + p) < val) {
p += i;
}
i >>= 1;
}
return p + 1;
}
int main() {
f >> n;
for (int i = 1; i <= n; ++i) {
f >> type;
if (type == 1) {
f >> s;
if (mp[s] == 1)
continue;
mp[s] = 1;
++nr;
v[nr].s = s;
v[nr].pos = nr;
}
else {
f >> q[++m].val;
q[m].nr = nr;
}
}
sort (v + 1, v + nr + 1, cmp);
/*for (int i = 1; i <= nr; ++i) {
cout << v[i].pos << " " << v[i].s << '\n';
}*/
for (int i = 1; i <= nr; ++i) {
c[v[i].pos] = i;
}
int p = 1;
for (int i = 1; i <= m; ++i) {
while (p <= nr && p <= q[i].nr) {
update (c[p], 1);
++p;
}
g << v[cbin (q[i].val)].s << '\n';
}
return 0;
}