Cod sursa(job #578345)

Utilizator bora_marianBora marian bora_marian Data 11 aprilie 2011 11:10:03
Problema Nums Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<fstream>
#include<iostream>
#include<algorithm>
#include<vector>
#define DIM 100004
using namespace std;
int  arb[4*DIM],n,caract[DIM],sor[DIM],uq[DIM],cate,poz,rasp;
vector<char>S[DIM];
int comp(int a,int b);
int cauta(int nod,int st,int dr,int val);
void update(int nod,int st,int dr);
int main()
{
	ifstream fin("nums.in");
	ofstream fout("nums.out");
	fin>>n;
	int i,j;
	int q,c;
	for(i=1;i<=n;i++)
	{
		fin>>q;
		if(q==1)
		{
			fin.get();
			sor[++cate]=i;
			char d;
			while(fin.get(d) && d>='0' && d<='9')
			{
				S[i].push_back(d);
			}
		}
		else
		{
			fin>>c;
			uq[i]=c;
		}
		
	}
	sort(sor+1,sor+cate+1,comp);   
	for(i=1;i<=cate;i++)
	    caract[sor[i]]=i;
	for(i=1;i<=n;i++)
	{
		if(caract[i]!=0)
		{
			poz=caract[i];
			update(1,1,n);  
		}
		else
		{
			rasp=cauta(1,1,n,uq[i]);
			for(j=0;j<S[sor[rasp]].size();j++)
			   fout<<S[sor[rasp]][j];
			fout<<"\n";   
	     }
	 }
	 return 0;
}
void update(int nod,int st,int dr)
{
	if(st==dr)
	{
		arb[nod]=1;
		return ;
	}
	else
	{
		int mij=(st+dr)/2;
		if(poz<=mij)
		  update(2*nod,st,mij);
		else 
		  update(2*nod+1,mij+1,dr);  
	 }
	 arb[nod]=arb[2*nod]+arb[2*nod+1];
 }
 int cauta(int nod,int st,int dr,int val)
 {
 	if(st==dr)
 	  return st;
 	int mij=(st+dr)/2;
 	if(arb[2*nod]>=val)
 	    return cauta(2*nod,st,mij,val);
 	val-=arb[2*nod];
 	return cauta(2*nod+1,mij+1,dr,val);
}
	       
int comp(int a,int b)
{
	if(S[a].size()==S[b].size())
	{
	   if(S[a]>S[b])
	     return 0;
	   return 1;
   }
   else
   {
      if(S[a].size()>S[b].size())
         return 0;
      else
         return 1;
	 }
   return 1;
}