Cod sursa(job #97494)

Utilizator coderninuHasna Robert coderninu Data 7 noiembrie 2007 08:41:48
Problema Orase Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 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];

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()
{
	qSort(1,n);
	last=1;
	for ( i=2; i<=n; i++ )
	{
		if ( d[i]-d[last]+l[i]+l[j] > d[i]-d[i-1]+l[i]+l[i-1] )
		{
			aux=d[i]-d[last]+l[i]+l[j];
			if (aux>rez) rez=aux;
		}
		else
		{
			aux=d[i]-d[i-1]+l[i]+l[i-1];
			last=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);
}