Cod sursa(job #197856)

Utilizator AndreyPAndrei Poenaru AndreyP Data 6 iulie 2008 19:14:12
Problema Reconst Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 2010
int n,m;
struct abc
{
	int a,b,s;
};
abc v[N];
int sir[N];
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;
}
bool verif()
{
	int i;
	bool ok=false;
	for(i=1; (i<m)&&(!ok); i++)
	{
		if(v[i].a==v[i-1].a)
		{
			ok=true;
			if(v[i].b==v[i-1].b)
			{
				swap(v[i],v[m-1]);
				m--;
			}
			else
			{
				v[i].a=v[i-1].b+1;
				v[i].s-=v[i-1].s;
			}
		}
	}
	if(ok)
		sort(v,v+m,compar);
	return ok;
}
bool compar1(const abc &x,const abc &y)
{
	if(x.b<y.b)
		return true;
	if(x.b>y.b)
		return false;
	if(x.a<y.a)
		return true;
	return false;
}
void determin()
{
	int i,j,a,b,s;
	sort(v,v+m,compar1);
	for(i=m-1; i>=0; i--)
	{
		s=0;
		a=v[i].a;
		b=v[i].b;
		for(j=a; j<=b; j++)
			s+=sir[j];
		sir[v[i].a]=v[i].s-s;
	}
}
void scrie()
{
	int i;
	for(i=1; i<n; i++)
		printf("%d ",sir[i]);
	printf("%d\n",sir[n]);
}
int main()
{
	freopen("reconst.in","r",stdin);
	freopen("reconst.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=0; i<m; i++)
		scanf("%d%d%d",&v[i].a,&v[i].b,&v[i].s);
	sort(v,v+m,compar);
	bool ok=true;
	while(ok)
		ok=verif();
	determin();
	scrie();
	return 0;
}