Pagini recente » Cod sursa (job #1299685) | Cod sursa (job #421371) | Cod sursa (job #1797126) | Cod sursa (job #2082834) | Cod sursa (job #521354)
Cod sursa(job #521354)
#include <stdio.h>
#include <vector>
#include <algorithm>
#define NMax 100005
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];
char s[NMax];
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);
else
{
vector<int>::iterator it=lower_bound( a[L].begin() , a[L].end() , V , cmp);
a[L].insert( it , &V , &V +1);
}
++c[L];
++V;
}
int Query(int k)
{
int i;
for (i=0;k>0;++i)
if ( k-c[i]>0 )
k-=c[i];
else
break;
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;
}