Cod sursa(job #305989)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 19 aprilie 2009 11:11:08
Problema Nums Scor Ascuns
Compilator cpp Status done
Runda Marime 3 kb
using namespace std;

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <algorithm>

#define f first
#define s second
#define II inline
#define db double
#define ll long long
#define mp make_pair
#define pb push_back
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define FORit(V) for((V)::iterator it = V.begin();it != V.end();++it)
#define CC(V) memset((V),0,sizeof((V)))

#define IN  "nums.in"
#define OUT "nums.out"
#define N_MAX 1<<17
#define Sqrt 330

typedef pair<int,int> pi;
typedef vector<int> VI;
typedef pair<pi,string> data; 
typedef vector<string> VS;

int size(-1),N,K,C[N_MAX];
bool type[N_MAX];
vector<data> V(N_MAX);
string word[1<<17];
char buffer[1<<23];
int Aib[Sqrt],Nr[Sqrt],A[N_MAX];

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d",&N);
	fread(buffer,1,1<<23,stdin);
}	

II void read(int &aux)
{
	aux = 0;
	for(;buffer[K] < '0' || buffer[K] > '9';++K);
	for(;buffer[K] >= '0' && buffer[K] <= '9';++K)
		aux = aux * 10 + buffer[K] - '0';
}

II void read_string(int poz)
{
	int next(0);
	char nr[1<<17];
	for(;buffer[K] < '0' || buffer[K] > '9';++K);
	for(;buffer[K] >= '0' && buffer[K] <= '9';++K)
		nr[++next] = buffer[K] - '0';
	V[poz].s.resize(next);
	V[poz].f.s = next;
	FOR(i,0,next-1)
		V[poz].s[i] = nr[i+1];
}

II bool comp(data x,data y)
{
	if(x.f.s != y.f.s)
		return x.f.s < y.f.s;
	FOR(i,0,(int)x.s.size()-1)
		if(x.s[i] != y.s[i])
			return x.s[i] < y.s[i];
	return x.f.f < y.f.f;	
}

II void compute()
{
	int tip(0),next(0);
	
	FOR(i,1,N)
	{
		read(tip);
		if(!tip)
		{
			type[i] = false;
			read(C[++C[0]]);
			continue;
		}
		type[i] = true;
		V[++next].f.f = ++C[0];
		read_string(next);
	}
	sort(V.begin()+1,V.begin()+next+1,comp);
	
/*	FOR(i,1,next)
	{
		printf("%d %d : ",V[i].f.f,V[i].f.s);
		FOR(j,0,(int)V[i].s.size()-1)
			printf("%d",V[i].s[j]);
		printf("\n");	
	}	
*/	
	int nr = 0;
	FOR(i,1,next)
	{
		++nr;
		if(i^1 && V[i].s == V[i-1].s && V[i].f.s == V[i-1].f.s)
		{
			C[ V[i].f.f ] = -1;
			continue;
		}	
		C[ V[i].f.f ] = nr;
	}	
	
//	FOR(i,1,N)
//		printf("%d %d\n",type[i],C[i]);
}	

II void add(int val)
{
	A[val] = true;
	++Nr[val / Sqrt];
}

II void querry(int val)
{
	int k(0);
	for(;;++k)
		if(Nr[k] < val)
			val -= Nr[k];
		else
			break;
	k *= Sqrt;
	FOR(i,k,1<<17)
	{
		// A se sterge//
		if(i > k+Sqrt)
			return;
		if(!A[i])
			continue;
		if(val>1)
		{
			--val;
			continue;
		}
		for(string::iterator it=(V[i].s).begin();it != (V[i].s).end();++it)
			buffer[++size] = *it + '0';
		buffer[++size] = '\n';
		return;
	}	
}

II void solve()
{
	CC(buffer);
	
	FOR(i,1,N)
		if(type[i] == true)
		{
			if(C[i] == -1)
				continue;
			add(C[i]);
		}	
		else
			querry(C[i]);
	buffer[++size] == '\0';
	printf("%s",buffer);
}

int main()
{
	scan();
	compute();
	solve();
	
	return 0;
}