Cod sursa(job #197936)

Utilizator CezarMocanCezar Mocan CezarMocan Data 7 iulie 2008 12:32:48
Problema Reconst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct marmota_tripla{long a; long b; long c;};

long n,i,j,sol[2010],x[2010],y[2010],m,s[2010],sum;
marmota_tripla v[2010];

bool cmp(marmota_tripla a, marmota_tripla b)
    {
    if (a.a<=b.a||(a.a==b.a&&a.b>b.b))
        return true;
    else
        return false;    
    }
    
void sparge(marmota_tripla t)
    {
    marmota_tripla nou;
/*    if (t.a==t.b&&x[t.a]==0)
        {
        sol[t.a]=t.c;
        return;
        }*/
    if (x[t.a]==0)
        {
        x[t.a]=t.b;
        y[t.a]=t.c;    
        }    
    else
        {
        if (t.b==x[t.a])
            return;
        if (t.b>x[t.a])
            {
            nou.a=x[t.a]+1;
            nou.b=t.b;
            nou.c=t.c-y[t.a];    
            sparge(nou);
            }    
        else
            {
            nou.a=t.b+1;
            nou.b=x[t.a];
            nou.c=y[t.a]-t.c;
            x[t.a]=t.b;
            y[t.a]=t.c;
            sparge(nou);    
            }
        }
    }

int main(){
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].a,&v[i].b,&v[i].c);    
sort(v+1,v+m+1,cmp);
for (i=1;i<=m;i++)
    sparge(v[i]);
/*for (i=1;i<=n;i++)
    printf("%d %d %d\n",i,x[i],y[i]);*/
s[n]=sol[n];
for (i=n;i>=1;i--)
    {
    if (x[i])
        {
        sum=s[i+1]-s[x[i]+1];    
        sol[i]=y[i]-sum;   
        }    
    s[i]=s[i+1]+sol[i];        
    }
for (i=1;i<=n;i++)
    printf("%d ",sol[i]);
return 0;    
}