Cod sursa(job #197682)

Utilizator AndreyPAndrei Poenaru AndreyP Data 5 iulie 2008 13:51:52
Problema Reconst Scor 0
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 2.17 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 2010
#define inf 2147483647
int n,m;
struct abc
{
	int a,b,s;
};
abc v[N];
int sir[N],aflat,n1;
bool compar(const abc &x,const abc &y)
{
	if(x.a<y.a)
		return true;
	if(x.a>y.a)
		return false;
	if(x.b<y.b)
		return true;
	return false;
}
void citire()
{
	int i;
	scanf("%d%d",&n,&m);
	n1=n-1;
	for(i=1; i<=m; i++)
		scanf("%d%d%d",&v[i].a,&v[i].b,&v[i].s);
	for(i=1; i<=n; i++)
		sir[i]=inf;
	sort(v+1,v+m+1,compar);
}
int caut(abc x)
{
	int p=1,u=m,mij;
	while(p<u)
	{
		mij=(p+u)>>1;
		if(x.a<v[mij].a)
			u=mij;
		else
		if(x.a>v[mij].a)
			p=mij+1;
		else
		{
			if(x.b<=v[mij].b)
				u=mij;
			else
				p=mij+1;
		}
	}
	if(p>m)
		p--;
	return p;
}
int maieunul()
{
	int s=0,poz,care,i;
	abc aux;
	for(i=1; i<=n; i++)
	{
		if(sir[i]!=inf)
			s+=sir[i];
		else
			care=i;
	}
	aux.a=1;
	aux.b=n;
	poz=caut(aux);
	if((aux.a==v[poz].a)&&(aux.b==v[poz].b))
	{
		sir[care]=v[poz].s-s;
		return 1;
	}
	return 0;
}
void scoate()
{
	int i;
	for(i=1; i<=m; i++)
	{
		if(v[i].b-v[i].a)
		{
			if(sir[v[i].a]!=inf)
			{
				v[i].s-=sir[v[i].a];
				v[i].a++;
			}
			if(v[i].b-v[i].a)
			{
				if(sir[v[i].b]!=inf)
				{
					v[i].s-=sir[v[i].b];
					v[i].b--;
				}
			}
		}
	}
	sort(v+1,v+m+1,compar);
}
void rezolva()
{
	int i;
	abc aux;
	int poz;
	for(i=1; (i<=m)&&(aflat<n); i++)
	{
		if(v[i].a==v[i].b)
		{
			sir[v[i].a]=v[i].s;
			aflat++;
		}
		else
		{
			aux.a=v[i].a+1;
			aux.b=v[i].b;
			poz=caut(aux);
			if((v[poz].a==aux.a)&&(v[poz].b==aux.b))
			{
				sir[v[i].a]=v[i].s-v[poz].s;
				aflat++;
			}
			aux.a=v[i].a;
			aux.b--;
			poz=caut(aux);
			if((v[poz].a==aux.a)&&(v[poz].b==aux.b))\
			{
				sir[v[i].b]=v[i].s-v[poz].s;
				aflat++;
			}
		}
	}
	if(aflat==n)
		return;
	if(aflat==n1)
	{
		poz=maieunul();
		if(poz)
		{
			aflat++;
			return;
		}
	}
	scoate();
}
int main()
{
	freopen("reconst.in","r",stdin);
	freopen("reconst.out","w",stdout);
	citire();
	while(aflat!=n)
		rezolva();
	int i;
	for(i=1; i<n; i++)
		printf("%d ",sir[i]);
	printf("%d\n",sir[n]);
	return 0;
}