Cod sursa(job #306021)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 19 aprilie 2009 13:52:01
Problema Nums Scor Ascuns
Compilator cpp Status done
Runda Marime 2.35 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>

#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair

#define IN  "nums.in"
#define OUT "nums.out"
#define N_MAX 1<<17
#define C_MAX 100000

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

struct copac
{
	int fiu[10],nr[10];
	copac() 
	{
		CC(fiu),CC(nr);
	}
} Trie[1<<19];
char buffer[1<<17],sir[1<<17];
int A[1<<18];
int size,x,N,next;

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

II void insert(int nod,char *p)
{
	if(*p == '\n')
		return;
	int s = *p - '0';
	if(!Trie[nod].fiu[s])
		Trie[nod].fiu[s] = ++next;
	
	++Trie[nod].nr[s];
	insert(Trie[nod].fiu[s],p+1);
}

II void querry(int nod)
{
	FOR(i,0,9)
	{
		if(!Trie[nod].nr[i])
			continue;
		if(Trie[nod].nr[i] < x)
			x -= Trie[nod].nr[i];
		else
		{
			buffer[++size] = i + '0';
			querry(Trie[nod].fiu[i]);
			return;
		}
	}	
}

II int querry(int nod,int st,int dr)
{
	if(st==dr)
		return st;
	
	int ln = (nod<<1);
	int rn = ln+1;
	int mij = (st+dr)>>1;
	
	if(A[ln] < x)
	{
		x -= A[ln];
		return querry(rn,mij+1,dr);
	}
	return querry(ln,st,mij);
}

II void update(int nod,int st,int dr)
{
	if(st==dr)
	{
		++A[nod];
		return;
	}
	
	int ln = (nod<<1);
	int rn = ln+1;
	int mij = (st+dr)>>1;
	
	if(x <= mij)
		update(ln,st,mij);
	else
		update(rn,mij+1,dr);
	A[nod] = A[ln] + A[rn];
}

II void solve()
{
	next = (C_MAX) << 1;
	
	int tip;
	FOR(i,1,N)
	{
		scanf("%d",&tip);
		if(!tip)
		{
			scanf("%d",&x);
			
			size = -1;
			querry( querry(1,1,C_MAX) );
			buffer[++size] = '\0';
			
			printf("%s\n",buffer);
			continue;
		}	
		
		fgets(sir,1<<17,stdin);
		for(x=0;sir[x] != '\n' && sir[x] != '\0';++x);
		--x;
		update(1,1,C_MAX);
		insert(x,sir+1);
	}	
}

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