Cod sursa(job #522341)

Utilizator crushackPopescu Silviu crushack Data 14 ianuarie 2011 21:28:45
Problema Nums Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#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;
}