Cod sursa(job #483315)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 7 septembrie 2010 22:59:35
Problema Reconst Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

#define minim(a,b) (a<b ? a : b)
#define maxim(a,b) (a>b ? a : b)

int s[2005];
int n,m,poz;
int p[2005];
struct per
{
    int x,y,z;
};
per v[2005];

inline int cmp(const per& a,const per& b)
{
    return (a.y<b.y);
}

int main ()
{
    int i,p1,p2;
    per aux;
    freopen("reconst.in","r",stdin);
    freopen("reconst.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
        scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);
    sort(v+1,v+m+1,cmp);
    for(i=2;i<=m;i++)
    {
        poz=i;
        while(poz>=1 && v[poz].y<=v[poz-1].y)
            if(v[poz].y==v[poz-1].y)
            {
                p1=minim(v[poz].x,v[poz-1].x);
                p2=maxim(v[poz].x,v[poz-1].x)-1;
                if(p1>p2)
                    break;
                v[poz].x=p1;v[poz].y=p2;
                v[poz].z=maxim(v[poz].z,v[poz-1].x)-minim(v[poz].z,v[poz-1].z);
            }
            else
            {
                aux=v[poz];
                v[poz]=v[poz-1];
                v[poz-1]=aux;
                poz--;
            }
    }
    poz=1;
    for(i=1;i<=n;i++)
    {
        if(i!=v[poz].y)
            continue;
        p[i]=v[poz].z-(s[i-1]-s[v[poz].x-1]);
        s[i]=s[i-1]+p[i];
        while(v[poz].z==v[poz+1].z)
            poz++;
        poz++;
    }
    for(i=1;i<=n;i++)
        printf("%d ",p[i]);
    printf("\n");
    return 0;
}