Pagini recente » Cod sursa (job #1814325) | Cod sursa (job #490807) | Cod sursa (job #2887912) | Cod sursa (job #1145055) | Cod sursa (job #591144)
Cod sursa(job #591144)
#include <algorithm>
#include <stdio.h>
#include <string>
#include <vector>
#define MAX 100010
#define bit(x) (x & (x ^ (x - 1)))
#define pb push_back
using namespace std;
int n, x;
char strCit[MAX];
vector <string> vctStr;
int aibAp[MAX];
inline void addAib(int loc)
{
for (int i = loc; i <= n; i += bit(i))
aibAp[i]++;
}
inline int searchAib(int loc)
{
int logN, rez;
for (logN = 1; logN <= n; logN <<= 1);
for (rez = 0; logN; logN >>= 1)
if (rez + logN <= n && loc >= aibAp[rez + logN])
rez += logN, loc -= aibAp[rez];
return rez;
}
inline bool cmp(const string &a, const string &b)
{
if (a.size() != b.size())
return a.size() < b.size();
else return a < b;
}
int main()
{
freopen("nums.in", "r", stdin);
freopen("nums.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d ", &x);
fgets(strCit, MAX, stdin);
strCit[strlen(strCit) - 1] = 0;
if (x)
vctStr.pb(strCit);
}
sort(vctStr.begin(), vctStr.end(), cmp);
fclose(stdin);
freopen("nums.in", "r", stdin);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d ", &x);
if (x)
{
fgets(strCit, MAX, stdin);
strCit[strlen(strCit) - 1] = 0;
string str = strCit;
vector <string>::iterator it = lower_bound(vctStr.begin(), vctStr.end(), str, cmp);
addAib(int(it - vctStr.begin()) + 1);
}
else
{
int poz;
scanf("%d", &poz);
puts(vctStr[searchAib(poz) - 1].c_str());
}
}
fclose(stdin);
fclose(stdout);
return 0;
}