Pagini recente » Cod sursa (job #727798) | Cod sursa (job #1023000) | Cod sursa (job #2119400) | Cod sursa (job #1139291) | Cod sursa (job #521355)
Cod sursa(job #521355)
#include <stdio.h>
#include <vector>
#include <algorithm>
#define NMax 100005
#define zeros(x) ( ( x ^ (x-1))&x )
using namespace std;
const char IN[]="nums.in",OUT[]="nums.out";
int N,V;
vector<int> a[NMax];
vector<int> nums[NMax];
int c[NMax];
int arb[NMax];
char s[NMax];
void aInsert(int x)
{
for (;x<NMax;x+=zeros(x))
++arb[x];
}
int aQuery(int x)
{
int r=0;
for (;x>0;x-=zeros(x))
r+=arb[x];
return r;
}
bool cmp(int x,int y)
{
int i;
if (nums[x][0]>nums[y][0]) return false;
if (nums[x][0]<nums[y][0]) return true;
for (i=nums[x][0];i>0 && nums[x][i]==nums[y][i];--i);
if (nums[x][i]>nums[y][i]) return false;
if (nums[x][i]<nums[y][i]) return true;
return false;
}
void insert(char*s)
{
int i,L=strlen(s);
nums[V].resize(L + 1);
nums[V][0]=L;
for (i=1;i<=L;++i)
nums[V][i]= s[L-i] - '0';
if (a[L].size()==0)
a[L].push_back(V),
aInsert(L);
else
{
vector<int>::iterator it=lower_bound( a[L].begin() , a[L].end() , V , cmp);
a[L].insert( it , &V , &V +1),
aInsert(L);
}
++c[L];
++V;
}
int Query(int k)
{
int i,step;
/*for (i=0;k>0;++i)
if ( k-c[i]>0 )
k-=c[i];
else
break;*/
for (step=1;step<NMax;step<<=1);
for (i=0;step;step>>=1)
if (i+step<NMax && aQuery(i+step)<k)
i+=step;
k-=aQuery(i);
for (++i;!c[i];++i);
return a[i][k-1];
}
void write(int x)
{
int i;
for (i=nums[x][0];i>0;--i)
printf("%d",nums[x][i]);
printf("\n");
}
int main()
{
int i,c,k,r;
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d",&N);
for (i=0;i<N;++i)
{
scanf("%d",&c);
switch(c)
{
case 1:
scanf("%s",s);
insert(s);
break;
case 0:
scanf("%d",&k);
r=Query(k);
write(r);
break;
}
}
return 0;
}