Cod sursa(job #758075)

Utilizator maritimCristian Lambru maritim Data 14 iunie 2012 12:53:28
Problema Reconst Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;

FILE *f = fopen("reconst.in","r");
FILE *g = fopen("reconst.out","w");

typedef struct
{
	int x,y;
	int a;
} numar;

typedef struct Compare
{
	bool operator() (const numar a,const numar b) { if(a.x == b.x) return a.y < b.y; return a.x < b.x; }
} ICompare;

#define MaxN 2010
#define MaxM 2010

int N,M;
numar A[MaxM];
int B[MaxN],C[MaxN];
int Sf[MaxN],In[MaxN];

inline numar CreareNumar(int b,int c,int d)
{
	numar a = {b,c,d};
	
	return a;
}

void citire(void)
{
	fscanf(f,"%d %d",&N,&M);
	for(int i=1;i<=M;i++)
		fscanf(f,"%d %d %d",&A[i].x,&A[i].y,&A[i].a);
}

void afisare(void)
{
	for(int i=1;i<=M;i++)
		printf("%d %d %d\n",A[i].x,A[i].y,A[i].a);
	printf("\n");
}

inline void DeplasareDreapta(int a)
{
	for(;(A[a].x > A[a+1].x || (A[a].x == A[a+1].x && A[a].y > A[a+1].y)) && a < M;)
	{	
		numar aux = A[a];
		A[a] = A[a+1];
		A[++a] = aux;
	}
}

void CreareSir(void)
{		
	for(int i=1;i<=M;i++)
		In[A[i].x] = A[i].a,Sf[A[i].x] = A[i].y;
		
	for(int i=N;i;B[i] = C[i] + B[i+1],i--)
		if(Sf[i])
			C[i] = In[i]-(B[i+1]-B[Sf[i]+1]);
}

void Rezolvare(void)
{
	sort(A+1,A+M+1,ICompare());
	
	for(int i=1;i<M;i++)
		for(int j=i+1;A[i].x == A[j].x && j<=M;)
		{
			A[j] = CreareNumar(A[i].y+1,A[j].y,A[j].a-A[i].a);
			DeplasareDreapta(j);
			//afisare();
		}
		
	CreareSir();
}

int main()
{
	citire();
	Rezolvare();
			
	for(int i=1;i<=N;i++)
		fprintf(g,"%d ",C[i]);
}