Pagini recente » Cod sursa (job #2103427) | Cod sursa (job #2483848) | Cod sursa (job #752475) | Cod sursa (job #22135) | Cod sursa (job #319329)
Cod sursa(job #319329)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
const int maxn = 100001;
ifstream in("nums.in");
ofstream out("nums.out");
struct info
{
string nr;
int poz;
};
bool compare(const string &x, const string &y)
{
if ( x.size() < y.size() ) return 1;
else if ( x.size() > y.size() ) return 0;
else
{
for ( unsigned int i = 0; i < x.size(); ++i )
if ( x[i] < y[i] )
return 1;
else if ( x[i] > y[i] )
return 0;
}
return 0;
}
bool operator <(const info &x, const info &y)
{
return compare(x.nr, y.nr);
}
int n, k;
int poz_in_sorted[maxn];
vector <info> all; // toate datele de intrare
vector <info> numbers; // numai numerele
int arb[1 << 18];
void read()
{
in >> n;
info tmp;
all.push_back(tmp);
numbers.push_back(tmp);
for ( int i = 1; i <= n; ++i )
{
in >> tmp.poz >> tmp.nr;
all.push_back(tmp);
if ( tmp.poz == 1 )
{
tmp.poz = ++k;
numbers.push_back(tmp);
}
}
std::sort(numbers.begin()+1, numbers.end());
}
#define left (2*nod)
#define right (left+1)
#define mij ((st + dr) / 2)
void update(int nod, int st, int dr, int what)
{
if ( what < st || what > dr ) return;
if ( st == dr )
{
++arb[nod];
return;
}
update(left, st, mij, what);
update(right, mij+1, dr, what);
arb[nod] = arb[left] + arb[right];
}
int query(int nod, int st, int dr, int poz)
{
if ( st == dr )
return st;
if ( arb[left] < poz ) return query(right, mij+1, dr, poz - arb[left]);
else return query(left, st, mij, poz);
}
int main()
{
read();
for ( int i = 1; i <= k; ++i )
poz_in_sorted[ numbers[i].poz ] = i;
int x;
int p = 0;
for ( int i = 1; i <= n; ++i )
{
if ( all[i].poz == 1 )
update(1, 1, k, poz_in_sorted[++p]);
else
{
istringstream t(all[i].nr);
t >> x;
out << numbers[query(1, 1, k, x)].nr << endl;
}
}
return 0;
}