Cod sursa(job #521354)

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