Pagini recente » Cod sursa (job #1615439) | Cod sursa (job #1532127) | Cod sursa (job #1818633) | Cod sursa (job #3216908) | Cod sursa (job #319373)
Cod sursa(job #319373)
#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
{
char nr[maxn];
int poz;
};
int compare(const char x[], const char y[])
{
int t = strlen(x);
int p = strlen(y);
if ( t < p ) return 1;
else if ( t > p ) return 0;
else
{
for ( int i = 0; i < t; ++i )
if ( x[i] < y[i] )
return 1;
else if ( x[i] > y[i] )
return 0;
}
return -110;
}
bool operator <(const info &x, const info &y)
{
int t = compare(x.nr, y.nr);
if ( t == -110 )
return x.poz < y.poz;
else
return t;
}
int n, k;
int poz_in_sorted[maxn];
int dupp[maxn];
char all[maxn]; // toate datele de intrare
vector <info> numbers; // numai numerele
int queries[maxn];
string temp[maxn];
int arb[1 << 18];
void read()
{
in >> n;
info tmp;
numbers.push_back(tmp);
for ( int i = 1; i <= n; ++i )
{
in >> tmp.poz;
all[i] = tmp.poz;
if ( tmp.poz == 0 )
in >> queries[i];
else if ( tmp.poz == 1 )
{
in >> tmp.nr;
tmp.poz = ++k;
numbers.push_back(tmp);
}
}
in.close();
std::sort(numbers.begin()+1, numbers.end());
poz_in_sorted[ numbers[1].poz ] = 1;
for ( int i = 2; i <= k; ++i )
{
if ( !strcmp(numbers[i].nr, numbers[i-1].nr) )
dupp[ numbers[i].poz ] = 1;
poz_in_sorted[ numbers[i].poz ] = i;
}
}
void update(int nod, int st, int dr, int &what)
{
if ( what < st || what > dr ) return;
if ( st == dr )
{
++arb[nod];
return;
}
int q = nod << 1;
int mij = (st + dr) >> 1;
update(q, st, mij, what);
update(q + 1, mij+1, dr, what);
arb[nod] = arb[q] + arb[q + 1];
}
int query(int nod, int st, int dr, int poz)
{
if ( st == dr )
return st;
int q = nod << 1;
int mij = (st + dr) >> 1;
if ( arb[q] < poz ) return query(q + 1, mij+1, dr, poz - arb[q]);
else return query(q, st, mij, poz);
}
int main()
{
read();
int p = 0;
for ( int i = 1; i <= n; ++i )
{
if ( all[i] == 1 )
{
++p;
if ( !dupp[p] )
update(1, 1, k, poz_in_sorted[p]);
}
else
out << numbers[query(1, 1, k, queries[i])].nr << endl;
}
return 0;
}