Cod sursa(job #521355)

Utilizator crushackPopescu Silviu crushack Data 12 ianuarie 2011 09:59:58
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#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;
}