Pagini recente » Statistici Iulian Cristian Grigorita (iuliangrigorita) | Cod sursa (job #770674) | Cod sursa (job #1118975) | Cod sursa (job #1646499) | Cod sursa (job #1473954)
#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;
const int Limit = 100000;
int n , i , STEP;
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-1].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 = 0; i < v.size(); ++i)
{
//cout << v[i].F << '\n';
ord[v[i].S] = (i > 0 && v[i].F == v[i-1].F) ? ord[v[i-1].S] : (i + 1);
}
for (STEP = 1; STEP < n; 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;
}