Pagini recente » Cod sursa (job #1211232) | Cod sursa (job #2183147) | Cod sursa (job #2263068) | Cod sursa (job #605090) | Cod sursa (job #2175992)
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
ofstream fout ("nums.out"); ifstream fin ("nums.in");
typedef unsigned long long u64;
const int nmax = 1e5;
int n;
vector< string > v;
vector< int > ord;
pair<int, int> op[nmax + 1];
int val[nmax + 1];
int aint[4 * nmax + 1];
inline bool cmp (int a, int b) {
if (v[ a ].size() != v[ b ].size()) {
return (v[ a ].size() < v[ b ].size());
}
return v[ a ] < v[ b ];
}
void precalc () {
sort(ord.begin(), ord.end(), cmp);
for (int i = 0; i < (int)ord.size(); ) {
int j = i;
while (j < (int)ord.size() && v[ ord[ i ] ] == v[ ord[ j ] ]) {
val[ ord[ j ] ] = i + 1;
++ j;
}
i = j;
}
}
void update (int nod, int x, int y, int pos) {
if (x == y) {
aint[ nod ] = 1;
return ;
}
int mij = (x + y) / 2;
if (pos <= mij)
update(2 * nod, x, mij, pos);
else
update(2 * nod + 1, mij + 1, y, pos);
aint[ nod ] = aint[2 * nod] + aint[2 * nod + 1];
}
int query (int nod, int x, int y, int k) {
if (x == y)
return x;
int mij = (x + y) / 2;
if (k <= aint[2 * nod]) {
return query(2 * nod, x, mij, k);
} else {
return query(2 * nod + 1, mij + 1, y, k - aint[2 * nod]);
}
}
int main () {
fin >> n;
for (int i = 1; i <= n; ++ i) {
fin >> op[ i ].first;
if (op[ i ].first == 0) {
fin >> op[ i ].second;
} else {
string x;
fin >> x;
v.push_back( x );
ord.push_back((int)v.size() - 1);
op[ i ].second = (int)v.size() - 1;
}
}
precalc ();
for (int i = 1; i <= n; ++ i) {
if (op[ i ].first == 0) {
fout << v[ ord[query(1, 1, n, op[ i ].second) - 1] ] << "\n";
} else {
update(1, 1, n, val[ op[ i ].second ]);
}
}
fout.close();
return 0;
}