Cod sursa(job #67603)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 25 iunie 2007 12:31:21
Problema Orase Scor 100
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 9-a si gimnaziu Marime 1.13 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
const int n_max = 50005;
struct oras
{
	int l, d;
} a[n_max];

int i, t1, t2, tt1, tt2, MAX, max2, n, m;
bool cmpf(const oras a, const oras b)
{
	return a.d < b.d;
}

inline int abs(int x)
{
	if (x < 0) return -x;
	return x;
}

inline int dist(int x, int y)
{
	return abs(a[x].d-a[y].d)+a[x].l+a[y].l;
}
void bulaneala()
{

	sort(a + 1, a + n + 1, cmpf);

	MAX = dist(1,2);
	t1 = 1;
	t2 = 2;
	for (i = 3; i <= n; ++ i)
	{
		if (dist(t1, i) > dist(t2, i))
		{
			max2 = dist(t1,i);
			tt1 = t1;
			tt2 = i;
		}
		else
		{
			max2 = dist(t2,i);
			tt1 = t2;
			tt2 = i;
		}
		if (max2 > MAX) 
		{
			MAX = max2;
			t1 = tt1;
			t2 = tt2;
		}
	}

}

void back()
{
	int i, j;
	for (i = 1; i < n; ++ i)
		for (j = i + 1; j <= n; ++ j)
			if (dist(i,j) > MAX)
				MAX = dist(i,j);
}

int main()
{
	freopen("orase.in","r",stdin);
	freopen("orase.out","w",stdout);
	scanf("%d %d", &m, &n);
	for (i = 1; i <= n; ++ i)
		scanf("%d %d",&a[i].d,&a[i].l);
	if (n > 1000)
		bulaneala();
	else
		back();
	printf("%d\n",MAX);
	return 0;
}