Cod sursa(job #97495)

Utilizator coderninuHasna Robert coderninu Data 7 noiembrie 2007 08:49:56
Problema Orase Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#define infile "orase.in"
#define outfile "orase.out"
#define nmax 50001

long n, m, i, j, last, rez, aux;
long d[nmax], l[nmax];
long c[nmax],dist;

void readData();
void writeData();
void solve();

long divide(long,long);
void qSort(long,long);

int main()
{
	readData();
	solve();
	writeData();
	return 0;
}

void readData()
{
	freopen(infile, "r", stdin);
	scanf("%ld %ld\n", &m, &n);
	for ( i=1; i<=n; i++ )
		scanf("%ld %ld\n", &d[i], &l[i]);
}

void solve()
{
	long aux;
	qSort(1,n);
	c[2]=1;
	rez=d[2]-d[1]+l[1]+l[2];
	for (i=3; i<=n; i++)
	{
		if (d[i]-d[i-1]+l[i]+l[i-1] > d[i]-d[c[i-1]]+l[i]+l[c[i-1]])
		{
			c[i]=i-1;
			aux=d[i]-d[i-1]+l[i]+l[i-1];
			if (aux>rez) rez=aux;
		}
		else
		{
			c[i]=c[i-1];
			aux=d[i]-d[c[i-1]]+l[i]+l[c[i-1]];
			if (aux>rez) rez=aux;
		}

	}

}

void writeData()
{
	freopen(outfile, "w", stdout);
	printf("%ld\n", rez);
	fclose(stdout);
}

long divide(long p, long q)
{
	long st=p, dr=q, x=d[p], y=l[p];
	while (st < dr)
	{
		while ( st<dr && d[dr]>=x ) dr--;
		d[st]=d[dr];
		l[st]=l[dr];
		while ( st<dr && d[st]<=x ) st++;
		d[dr]=d[st];
		l[dr]=l[st];
	}
	d[st]=x;
	l[st]=y;
	return st;
}

void qSort(long p, long q)
{
	long m=divide(p,q);
	if (m-1>p) qSort(p, m-1);
	if (m+1<q) qSort(m+1, q);
}