Cod sursa(job #75250)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 31 iulie 2007 17:57:27
Problema Orase Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <stdio.h>
long n,m;


class oras
{
        public:
        long d,l;
};

oras v[50001];
long dim;

void iofile(void)
{
        int i;
        freopen("orase.in","r",stdin);
        freopen("orase.out","w",stdout);
        scanf("%ld%ld",&m,&n);
        dim=n;
        for (i=1;i<=n;i++)
                scanf("%ld%ld",&v[i].d,&v[i].l);
        fclose(stdin);
}

void repair(long i)
{
        long max,l,r;
        oras aux;
        l=i<<1;
        r=l+1;
        max=i;
        if ((l<=dim)&&(v[l].d>v[i].d))
                max=l;
        if ((r<=dim)&&(v[r].d>v[max].d))
                max=r;
        if (max!=i)
                {
                        aux=v[i];
                        v[i]=v[max];
                        v[max]=aux;
                        repair(max);
                }
}


void build_heap(void)
{
        long i;
        for (i=n/2;i>=1;i--)
                repair(i);
}


void heapsort(void)
{
        long i;
        oras aux;
        build_heap();
        for (i=n;i>=2;i--)
                {
                        aux=v[1];
                        v[1]=v[i];
                        v[i]=aux;
                        dim--;
                        repair(1);
                }
}


long dist(long i,long j)
{
        return v[j].d-v[i].d+v[i].l+v[j].l;
}


void prel(void)
{
        long m1,m2,max,nm1,nm2,i;
        m1=1;
        m2=2;
        max=dist(1,2);
        for (i=3;i<=n;i++)
                {
                        nm1=m1;
                        nm2=m2;
                        if (dist(m1,i)>max)
                                {
                                        nm1=m1;
                                        nm2=i;
                                        max=dist(m1,i);
                                }
                        if (dist(m2,i)>max)
                                {
                                        nm1=m2;
                                        nm2=i;
                                        max=dist(m2,i);
                                }
                        m1=nm1;
                        m2=nm2;
                }
      printf("%ld\n",max);
      fclose(stdout);
}
        


int main(void)
{
        iofile();
        heapsort();
        prel();
        return 0;
}