Pagini recente » Cod sursa (job #1809482) | Cod sursa (job #141430) | Cod sursa (job #1801780) | Cod sursa (job #1565547) | Cod sursa (job #1473958)
#include <bits/stdc++.h>
#define F first
#define S second
#define last_bit(x) (x&(-x))
using namespace std;
ifstream fin("nums.in");
ofstream fout("nums.out");
const int Nmax = 100010;
int n , i , STEP , limit;
int aib[Nmax] , ord[Nmax];
bool tip[Nmax] , marked[Nmax];
vector < int > q;
vector < pair < string , int > > v;
void aibUpdate(int i)
{
for ( ; i <= limit; i += last_bit(i))
aib[i]++;
}
int aibQuery(int i)
{
int ret = 0;
for ( ; i ; i -= last_bit(i))
ret += aib[i];
return ret;
}
void search_(int pos)
{
int i , step = STEP;
for (i = 0; step; step >>= 1)
if (i + step <= limit && aibQuery(i + step) < pos)
i += step;
fout << v[i].F << '\n';
}
bool mode(pair < string , int > a , pair < string , int > b)
{
if (a.F.size() == b.F.size())
return (a.F < b.F);
else
return (a.F.size() < b.F.size());
}
int main()
{
fin >> n;
for (i = 1; i <= n; ++i)
{
fin >> tip[i];
if (tip[i] == 1)
{
string sir; fin >> sir;
v.push_back( { sir , i } );
}
else
{
int x; fin >> x;
q.push_back(x);
}
}
sort(v.begin() , v.end() , mode);
for (i = v.size() - 1; i >= 0; --i)
{
//cout << v[i].F << '\n';
ord[v[i].S] = (i < v.size() - 1 && v[i].F == v[i+1].F) ? ord[v[i+1].S] : (i + 1);
}
limit = v.size();
for (STEP = 1; STEP < limit; STEP <<= 1);
auto it = q.begin();
for (i = 1; i <= n; ++i)
if (tip[i] && !marked[ord[i]])
{
aibUpdate(ord[i]);
marked[ord[i]] = 1;
}
else if (!tip[i]) search_(*it++);
return 0;
}