Cod sursa(job #578328)

Utilizator loginLogin Iustin Anca login Data 11 aprilie 2011 10:50:50
Problema Nums Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
# include <fstream>
# include <iostream>
# include <algorithm>
# include <vector>
# define DIM 100003
# define pb push_back
using namespace std;
int n, o[DIM], w[DIM], p[DIM], b[DIM], a[4*DIM], s[DIM];
vector<char>V[DIM];

bool cmp (int i, int j)
{
	if (V[i].size()<V[j].size())return 1;
	if (V[i].size()>V[j].size())return 0;
	if (V[i]<V[j])return 1;
	return 0;
}

void read ()
{
	ifstream fin ("nums.in");
	fin>>n;
	char c;
	for(int i=1;i<=n;++i)
	{
		fin>>o[i];
		if (o[i]==1)
		{
			p[++p[0]]=i;
			fin.get();
			while(fin.get(c) && c>='0' && c<='9')
				V[i].pb(c);
		}
		else 
			fin>>w[i];
			
	}
}

void upd(int k, int st,int dr, int p)
{
	if (st==dr)
	{
		a[k]=1;
		return;
	}
	int mij=(st+dr)/2;
	if (p<=mij)upd(2*k, st, mij, p);
	else upd(2*k+1, mij+1,dr, p);
	a[k]=a[2*k]+a[2*k+1];
}

int query (int k, int st, int dr, int p)
{
	if (st==dr)
		return st;
	int mij=(st+dr)/2;
	if (p>a[2*k])return query(2*k+1, mij+1, dr, p-a[2*k]);
	else return query(2*k, st, mij, p);
}

int egal (int i, int j)
{
	if (V[i].size() != V[j].size())return 0;
	if (V[i]<V[j] || V[j]<V[i])return 0;
	return 1;
}

void solve ()
{
	sort(p+1,p+p[0]+1, cmp);
	w[p[1]]=1;
	b[1]=p[1];
	int q=1, bag=0;
	for(int i=2;i<=p[0];++i)
	{
		if (!egal(p[i],p[i-1]))
			++q, b[q]=p[i], bag=1;
		else
			bag=0;
		if (bag)w[p[i]]=q;
		else w[p[i]]=0;
	}
	for(int i=1;i<=n;++i)
		if (o[i]==1)
		{
			if (w[i])
				upd(1, 1, q, w[i]);
		}
		else
			s[++s[0]]=b[query(1, 1, q, w[i])];
}

void write ()
{
	freopen("nums.out", "w", stdout);
	for(int i=1;i<=s[0];++i)
	{
		for(int j=0;j<V[s[i]].size();++j)
			printf("%c",V[s[i]][j]);
		printf("\n");
	}
}

int main()
{
	read ();
	solve ();
	write ();
	return 0;
}