Cod sursa(job #75250)
Utilizator | 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;
}