Pagini recente » Cod sursa (job #2237549) | Cod sursa (job #3227230) | Cod sursa (job #1215563) | Cod sursa (job #2972236) | Cod sursa (job #2631870)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("nums.in");
ofstream out("nums.out");
const int dim = 100005;
int n;
struct op
{
int tip;
string s;
int k;
}a[dim];
string b[dim],c[dim];
int pus[dim],arb[4*dim];
bool cmp(string a,string b)
{
if (a.length() == b.length())
{
return (a < b);
}
else return (a.length() < b.length());
}
void Update(int nod,int st,int dr,int poz)
{
if (st == dr)
{
arb[nod] = 1;
return ;
}
if (poz <= (st+dr)/2)
{
Update(2*nod , st , (st+dr)/2,poz);
}
else Update(2*nod + 1 , (st+dr)/2 + 1 , dr,poz);
arb[nod] = arb[2*nod] + arb[2*nod + 1];
}
int Query(int nod,int st,int dr,int val)
{
if (st == dr) return st;
int mid = (st+dr)/2;
if (val == arb[nod])
{
if (arb[2*nod] >= val)
{
return Query(2*nod, st,mid, val);
}
else
{
return Query(2*nod+1,mid+1,dr,val - arb[2*nod]);
}
}
else
{
if (arb[2*nod] < val)
{
return Query(2*nod+1,mid+1,dr,val-arb[2*nod]) ;
}
else
{
return Query(2*nod,st,mid,val);
}
}
}
int Get_poz(string s,int n)
{
int st = 1;
int dr = n;
int rasp, mij;
while (st <= dr)
{
mij = (st+dr)/2;
if (c[mij].length() == s.length())
{
if (c[mij] == s)
{
return mij;
}
else if (c[mij] > s)
{
dr = mij - 1;
}
else st = mij + 1;
}
else if (c[mij].length() > s.length())
{
dr = mij-1;
}
else if (c[mij].length() < s.length())
{
st = mij + 1;
}
}
}
int main()
{
in >> n;
int cnt = 0;
for (int i=1; i<=n; i++)
{
in >> a[i].tip;
if (a[i].tip == 1)
{
in >> a[i].s;
b[++cnt] = a[i].s;
}
else in >> a[i].k;
}
int cnt1 = 0;
sort(b+1,b+cnt+1, cmp);
for (int i=1; i<=n; i++)
{
int j = i;
while (b[i] == b[j] && j <= n) j++;
c[++cnt1] = b[i];
///cout << i << " ";
i = j-1;
}
/*for (int i=1; i<=n; i++) cout << c[i] << " ";
cout << Get_poz("1232", cnt1);*/
for (int i=1; i<=n; i++)
{
if (a[i].tip == 1)
{
int poz = Get_poz(a[i].s, cnt1);
//cout << a[i].s << " " << poz << "\n";
if (!pus[poz])
{
pus[poz] = 1;
Update(1,1,n,poz);
}
}
else
{
out << c[Query(1,1,n,a[i].k)] << "\n";
}
}
return 0;
}