Pagini recente » Istoria paginii blog/biografii-olimpici | Cod sursa (job #2122721) | Cod sursa (job #1826339) | Cod sursa (job #2429178) | Cod sursa (job #2583137)
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
ifstream fin("nums.in");
ofstream fout("nums.out");
const int NMAX = 100000;
int N;
bool type[NMAX + 2];
int kth[NMAX + 2];
int nrStrings;
pair < int, pair < string, int > > strings[NMAX + 2];
int label[NMAX + 2];
///AINT///
struct Aint
{
int v[4 * NMAX];
void Update(int node, int st, int dr, int pos)
{
if(st == dr)
{
v[node]++;
return;
}
int mid = (st + dr) >> 1;
if(pos <= mid)
Update(2 * node, st, mid, pos);
else
Update(2 * node + 1, mid + 1, dr, pos);
v[node] = v[2 * node] + v[2 * node + 1];
}
int Query(int node, int st, int dr, int cant)
{
if(st == dr)
return st;
int mid = (st + dr) >> 1;
if(cant <= v[2 * node])
return Query(2 * node, st, mid, cant);
return Query(2 * node + 1, mid + 1, dr, cant - v[2 * node]);
}
};
Aint aint;
///AINT///
int main()
{
fin >> N;
for(int i = 1; i <= N; i++)
{
fin >> type[i];
if(type[i] == 0)
fin >> kth[i];
else
{
++nrStrings;
fin >> strings[nrStrings].second.first;
strings[nrStrings].first = strings[nrStrings].second.first.size();
strings[nrStrings].second.second = i;
}
}
sort(strings + 1, strings + nrStrings + 1);
for(int i = 1; i <= nrStrings; i++)
if(strings[i].second.first != strings[i - 1].second.first)
label[strings[i].second.second] = i;
for(int i = 1; i <= N; i++)
{
if(type[i] == 0)
{
int p = aint.Query(1, 1, N, kth[i]);
fout << strings[p].second.first << '\n';
}
else
{
if(label[i] > 0)
aint.Update(1, 1, N, label[i]);
}
}
return 0;
}