Cod sursa(job #479960)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 25 august 2010 20:04:53
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
#define N_MAX 100002
string a[N_MAX];
char c[N_MAX];
int n,i,j,t,k;
int N,nf,Nf;
int intr[N_MAX];
int IND[N_MAX],poz[N_MAX];
int aib[N_MAX];

inline int LSB(int i)
{
	return i&(-i);
}

void update(int ind,int val)
{
	for(int i=ind;i<=Nf;i+=LSB(i))
		aib[i]+=val;
}

int query(int sum)
{
	int i,step;
	for(step=1;step<Nf;step<<=1);
	for(i=0;step;step>>=1)
		if(i+step<=Nf&&aib[i+step]<sum)
		{
			i+=step;
			sum-=aib[i];
			if(!sum)
				return i;
		}
	return i+1;
	return -1;
}

struct cmp
{
	bool operator () (string a,string b) const
	{
		int la=a.size();
		int lb=b.size();
		return la<lb||la==lb&&a.compare(b)<0;
	}
};

struct cmp2
{
	bool operator () (int i,int j) const
	{
		int la=a[i].size();
		int lb=a[j].size();
		return la<lb||la==lb&&a[i].compare(a[j])<0;
	}
};

int main()
{
	freopen("nums.in","r",stdin);
	freopen("nums.out","w",stdout);

	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&t);
		if(t)
		{
			scanf("%s",c);
			a[++N]=c;
		}
		else
		{
			scanf("%d",&k);
			intr[i]=k;
		}
	}

	for(i=1;i<=N;i++)
		IND[i]=i;

	sort(IND+1,IND+N+1,cmp2());
	
	for(i=1;i<=N;)
	{
		int Min=1<<15;
		for(j=i;j<=N;j++)
		{
			if(a[IND[i]]!=a[IND[j]])
				break;
			Min=min(Min,IND[j]);
		}
		IND[++Nf]=Min;
		poz[Min]=Nf;
		i=j;
	}

	for(i=1;i<=n;i++)
	{
		nf+=intr[i]==0;
		if(intr[i])
		{
			j=query(intr[i]);
			printf("%s\n",a[IND[j]].c_str());
		}
		else
		{
			if(poz[nf]==0)
				continue;

			update(poz[nf],1);
		}
	}

	return 0;
}