Cod sursa(job #522038)

Utilizator crushackPopescu Silviu crushack Data 14 ianuarie 2011 09:52:14
Problema Nums Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#define NMax 100005

using namespace std;

const char IN[]="nums.in",OUT[]="nums.out";

int N,V;
char s[NMax];
vector<int> a[NMax];
vector<int> r;

bool cmp(int x,int y)
{
	int i;
	if (a[x][0]>a[y][0]) return false;
	if (a[y][0]>a[x][0]) return true;
	
	for (i=a[x][0];i>0 && a[x][i]==a[y][i];--i);
	
	if (a[x][i]>a[y][i]) return false;
	if (a[y][i]>a[x][i]) return true;
	
	return true;
}

void read(char* s)
{
	int i,L=strlen(s);
	a[V].resize( L+3);
	a[V][0]=L;
	for (i=1;i<=a[V][0];++i)
		a[V][i]= s[ L-i ] - '0';
	r.push_back(V);
	++V;
}

void Query(int k)
{
	nth_element(r.begin(), r.begin()+k-1,r.end(),cmp);
	int i,x= r[k-1];
	for (i=a[x][0];i>0;--i)
		printf("%d",a[x][i]);
	printf("\n");
}

int main()
{
	int i,c,k;
	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);
				read(s);
			break;
			case 0:
				scanf("%d",&k);
				Query(k);
			break;
		}
	}
	
	return 0;
}