Cod sursa(job #1985304)

Utilizator ericutzdevilEric Spataru ericutzdevil Data 27 mai 2017 13:46:30
Problema Reconst Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include<cstdio>
#include<algorithm>

using namespace std;

struct ura
{
    int st;
    int dr;
    int sum;
};

ura v[100001];

bool sortare (ura a, ura b)
{
    if (b.dr == a.dr)
    {
        return a.st>b.st;
    }
    return a.dr>b.dr;
}

bool sortare2 (ura a, ura b)
{
    if (b.st == a.st)
    {
        return a.dr>b.dr;
    }
    return a.st>b.st;
}

int sol[100001];

int main()

{

    freopen ("reconst.in","r",stdin);
    freopen ("reconst.out","w",stdout);

    int n,m,a,b,s,i,j;

    scanf ("%d%d",&n,&m);

    for (i=1; i<=m; i++)
    {
        scanf ("%d%d%d",&v[i].st,&v[i].dr,&v[i].sum);
    }

    int intCurent=m,intMaxim=m;

    int m2=m,pp=0,gasite=0;

    while (pp==0)
    {
        sort (v+1,v+m2+1,sortare);
        for (i = 1; i <= m2 && gasite != n; i ++)
        {
            if (v [i].st == v[i].dr && sol[v[i].st] != v[i].sum)
            {
                sol[v[i].st] = v[i].sum;
                gasite++;
            }
            for (j=i+1; j<=m2&&gasite!=n; j++)
            {
                if (v[i].dr==v[j].dr)
                {
                    v[++m2].st = v[j].st;
                    v[m2].dr = v[i].st-1;
                    v[m2].sum = v[j].sum - v[i].sum;
                    if (v[m2].st == v[m2].dr&&sol[v[m2].st] != v[m2].sum)
                    {
                        sol[v[m2].st] = v[m2].sum;
                        gasite++;
                    }
                }
            }
        }





        sort (v+1,v+m2+1,sortare2);
        for (i = 1; i <= m2 && gasite != n; i ++)
        {
            if (v [i].st == v[i].dr && sol[v[i].st] != v[i].sum)
            {
                sol[v[i].st] = v[i].sum;
                gasite++;
            }
            for (j=i+1; j<=m2&&gasite!=n; j++)
            {
                if (v[i].st==v[j].st)
                {
                    v[++m2].st = v[j].dr + 1;
                    v[m2].dr = v[i].dr;
                    v[m2].sum = v[i].sum - v[j].sum;
                    if (v[m2].st == v[m2].dr && sol[v[m2].st] != v[m2].sum)
                    {
                        sol[v[m2].st] = v[m2].sum;
                        gasite++;
                    }
                }
            }
        }





        if (gasite==n)
            pp=1;
    }

    for (i=1;i<=n;i++)
        printf ("%d ",sol[i]);

    return 0;
}