Pagini recente » Cod sursa (job #1567875) | Cod sursa (job #2313744) | Cod sursa (job #435112) | Cod sursa (job #2596626) | Cod sursa (job #1135915)
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>
#define DN 100003
#define INF (1<<30)
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
struct operatii{
int op,k;
};
struct st{
string nr;
int ind;
} v[DN];
int sz,arb[4*DN],n,poz,k,S,p[DN];
operatii M[DN];
bool cmp(st a, st b) /// a<b ?
{
if(a.nr.size() == b.nr.size())
return a.nr < b.nr;
return a.nr.size() < b.nr.size();
}
void update(int nod,int left,int right){
if(left == right){
++arb[nod];
return;
}
int mij = ( left + right)>>1;
if( poz <= mij) update( nod<<1 , left , mij);
else update( ( (nod<<1) | 1 ),mij+1,right);
arb[nod] = arb[2*nod] + arb[2*nod+1];
}
void fnd(int nod,int left,int right){
if(left == right){
g<<v[left].nr<<"\n";
return;
}
int mij = ( left + right)>>1;
if( S + arb[2*nod] >= k && arb[2*nod] )
fnd( nod<<1 , left , mij);
else{
S+=arb[2*nod];
fnd(( (nod<<1) | 1 ),mij+1,right);
}
}
int main()
{
int m;
f>>m;
for(int i=1;i<=m;++i){
f>>M[i].op;
if(M[i].op){
f>>v[++sz].nr;
v[sz].ind = sz;
}
else
f>>M[i].k;
}
sort(v+1,v+sz+1,cmp);
for(int i=1;i<=sz;++i){
int min_ind = v[i].ind , poz = i;
if(i+1<=sz && v[i].nr == v[i+1].nr){
++i;
for(;v[i].nr == v[i-1].nr && i<=sz; ++i)
min_ind = min(min_ind , v[i].ind);
--i;
}
p[ min_ind ] = poz;
}
n = sz;
for(int i=1,c=0;i<=m;++i){
if(M[i].op){
poz = p[ ++c ];
if( !poz )
continue;
update(1,1,n);
}else{
k = M[i].k;
S=0;
fnd(1,1,n);
}
}
return 0;
}