Cod sursa(job #845017)

Utilizator stoicatheoFlirk Navok stoicatheo Data 30 decembrie 2012 12:46:36
Problema Reconst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 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);
}
 
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++)
    {
        int k =0;
         
        for(int j=i+1;A[i].x == A[j].x && A[i].y + 1 <= A[j].y && j<=M;j++,k++)
            A[j] = CreareNumar(A[i].y+1,A[j].y,A[j].a-A[i].a);
        for(;k>0;--k)
            DeplasareDreapta(i+k);
    }
         
    CreareSir();
}
 
int main()
{
    citire();
    Rezolvare();
             
    for(int i=1;i<=N;i++)
        fprintf(g,"%d ",C[i]);
}