Cod sursa(job #306841)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 21 aprilie 2009 23:54:53
Problema Nums Scor Ascuns
Compilator cpp Status done
Runda Marime 2.37 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 pair<char,int> pc;
typedef vector<pc> Vc;
typedef vector<string> VS;

vector<pc> Trie[1<<21];
char buffer[1<<23],sir[1<<17];
int Nr[1<<21],A[1<<18];
int size(-1),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;
	
	bool ok(false);
	for(Vc::iterator it = Trie[nod].begin();it != Trie[nod].end();++it)
		if(it->f == *p)
		{	
			++Nr[it->s];
			insert(it->s,p+1);
			ok = true;
		}
	if(!ok)
	{
		Trie[nod].pb( mp(*p,++next) );
		sort(Trie[nod].begin(),Trie[nod].end() );
		++Nr[next];
		insert(next,p+1);
	}
}

II void querry(int nod)
{
	for(Vc::iterator it = Trie[nod].begin();it != Trie[nod].end();++it)
		if(Nr[it->s] < x)
		{
			x -= Nr[it->s];
			continue;
		}
		else
		{
			buffer[++size] = it->f;  
			querry(it->s);
			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);
			querry( querry(1,1,C_MAX) );
			buffer[++size] = '\n';
			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);
	}	
	printf("%s\n",buffer);
}

int main()
{	
	scan();
	solve();
	
//	printf("Time %d ms\n",clock() );
	return 0;
}