Pagini recente » Cod sursa (job #649358) | Cod sursa (job #1317520) | Cod sursa (job #1000121) | Cod sursa (job #1349071) | Cod sursa (job #522341)
Cod sursa(job #522341)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#define NMax 100005
#define zeros(x) ( (x^(x-1))&x )
using namespace std;
const char IN[]="nums.in",OUT[]="nums.out";
int N,V=1;
char s[NMax];
struct elem{
int c,v;
} com[NMax];
vector<short int>nums[NMax];
vector<int> a;
int p[NMax];
int aib[NMax];
void insert(int x)
{
for (;x<V;x+=zeros(x))
aib[x]++;
}
int Query(int x)
{
int ret=0;
for (;x>0;x-=zeros(x))
ret+=aib[x];
return ret;
}
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 true;
}
void read(char*s)
{
int i,L=strlen(s);
nums[V].resize( L + 3);
nums[V][0]=L;
for (i=1;i<=L;++i)
nums[V][i]= s[ L - i] - '0';
a.push_back(V);
++V;
}
void print(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;
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d",&N);
a.push_back(0);
for (i=0;i<N;++i)
{
scanf("%d",&c);
com[i].c=c;
switch(c)
{
case 1:
scanf("%s",s);
com[i].v=V;
read(s);
break;
case 0:
scanf("%d",&k);
com[i].v=k;
break;
}
}
fclose(stdin);
sort( a.begin()+1 , a.end(),cmp);
for (i=1;i<V;++i)
p[ a[i] ]=i;
for (i=0;i<N;++i)
{
switch( com[i].c)
{
case 1:
insert(p[com[i].v]);
break;
case 0:
{
int step,j;
for (step=1;step<N;step<<=1);
for (j=-1;step;step>>=1)
if (j+step<N && Query(j+step)<=com[i].v)
j+=step;
print(a[j]);
}
break;
}
}
return 0;
}