Cod sursa(job #273591)

Utilizator alex23alexandru andronache alex23 Data 8 martie 2009 19:26:19
Problema Carnati Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.25 kb
#include <iostream>
#define NMAX 2015

using namespace std;

struct carnat{
	long long t, p;
};

carnat a[NMAX], b[NMAX];

FILE *f = fopen("carnati.in", "r"), *g = fopen("carnati.out", "w");

long long N, C, vector[NMAX], v[NMAX];

int swap(int a, int b)
{
	int aux = v[a];
	v[a] = v[b];
	v[b] = aux;

	return 0;
}
/*
long long add(long long x, long long y, long long k)
{
	a[k].p = x;
	a[k].t = y;
	while (a[k].p < a[(k - 1) / 2].p)
	{
		int aux = a[k].p;
		a[k].p = a[(k - 1) / 2].p;
		a[(k - 1) / 2].p = aux;
		aux = a[k].t;
		a[k].t = a[(k - 1) / 2].t;
		a[(k - 1) / 2].t = aux;
		k = (k - 1) / 2;
	}

	return 0;
}
*/

int addHeap(int k)
{
	v[k] = k;
	while (a[v[k]].p < a[v[(k - 1) / 2]].p)
	{
		swap(k, (k - 1) / 2);
		k = (k - 1) / 2;
	}

	return 0;
}

int delHeap(int k)
{
	b[k].p = a[v[0]].p;
	b[k].t = a[v[0]].t;

	v[0] = v[N - k - 1];
	int i = 0;
	while ((2 * i + 2 <= N - k - 2) && ((a[v[i]].p > a[v[2 * i + 1]].p) || (a[v[i]].p > a[v[2 * i + 2]].p)))
	{	
		if ((a[v[i]].p > a[v[2 * i + 1]].p) && (a[v[i]].p > a[v[2 * i + 2]].p))
		{	
			if (a[v[2 * i + 1]].p > a[v[2 * i + 2]].p)
			{
				swap(2 * i + 2, i);
				i = 2 * i + 2;
			}
			else
			{
				swap(2 * i + 1, i);
				i = 2 * i + 1;
			}
		}
		else
		{
			if (a[v[i]].p > a[v[2 * i + 1]].p)
			{
				swap(2 * i + 1, i);
				i = 2 * i + 1;
			}
			else
			{
				swap(2 * i + 2, i);
				i = 2 * i + 2;
			}
		}
	}
	if ((2 * i + 1 <= N - k - 2) && (a[v[i]].p > a[v[2 * i + 1]].p))
	{
		swap(2 * i + 1, i);
	}
	return 0;
}
/*
long long del(long long k)
{
	b[k].p = a[0].p;
	b[k].t = a[0].t;


	a[0].p = a[N - k - 1].p;
	a[0].t = a[N - k - 1].t;
	int i = 0;
	while ((2 * i + 2 <= N - k - 2) && ((a[i].p > a[2 * i + 1].p) || (a[i].p > a[2 * i + 2].p)))
	{
		if ((a[i].p > a[2 * i + 1].p) && (a[i].p > a[2 * i + 2].p))
		{
			if (a[2 * i + 1].p > a[2 * i + 2].p)
			{
				long long aux = a[2 * i + 2].p;
				a[2 * i + 2].p = a[i].p;
				a[i].p = aux;
				aux = a[2 * i + 2].t;
				a[2 * i + 2].t = a[i].t;
				a[i].t = aux;
				i = 2 * i + 2;
			}
			else
			{
				long long aux = a[2 * i + 1].p;
				a[2 * i + 1].p = a[i].p;
				a[i].p = aux;
				aux = a[2 * i + 1].t;
				a[2 * i + 1].t = a[i].t;
				a[i].t = aux;
				i = 2 * i + 1;
			}
		}
		else
		{
			if (a[i].p > a[2 * i + 1].p)
			{
				long long aux = a[2 * i + 1].p;
				a[2 * i + 1].p = a[i].p;
				a[i].p = aux;
				aux = a[2 * i + 1].t;
				a[2 * i + 1].t = a[i].t;
				a[i].t = aux;
				i = 2 * i + 1;
			}
			else
			{
				long long aux = a[2 * i + 2].p;
				a[2 * i + 2].p = a[i].p;
				a[i].p = aux;
				aux = a[2 * i + 2].t;
				a[2 * i + 2].t = a[i].t;
				a[i].t = aux;
				i = 2 * i + 2;
			}
		}
	}
	if ((2 * i + 1 <= N - k - 2) && (a[i].p > a[2 * i + 1].p))
	{
		long long aux = a[2 * i + 1].p;
		a[2 * i + 1].p = a[i].p;
		a[i].p = aux;
		aux = a[2 * i + 1].t;
		a[2 * i + 1].t = a[i].t;
		a[i].t = aux;
		i = 2 * i + 1;
	}

	return 0;
}

long long maxim(long long a, long long b, long long c)
{
	if (a < b)
	{
		if (b < c)
		{
			return c;
		}
		return b;
	}
	if (a < c)
		return c;
	return a;
}
*/
long long maxim(long long a, long long b)
{
	if (a < b) 
		return b;
	return a;
}

int main()
{
	fscanf(f, "%lld %lld", &N, &C);
	for (long long i = 0; i < N; ++i)
	{
		long long x, y;
		fscanf(f, "%lld %lld", &a[i].p, &a[i].t);
		//add(x, y, i);
		addHeap(i);
	}
	fclose(f);
	/*
	for (int i = 0; i < N; ++i)
	{
		//cout << b[i].p << " " << b[i].t << endl;
		cout << v[i] << " ";
	}
	*/

	for (long long i = 0; i < N; ++i)
	{
		//del(i);
		delHeap(i);
	}

	long long max = 0;
	for (int i = 0; i < N; ++i)
	{
		//pretul stabilit este b[i].t
		long long pret = b[i].t;
		if (pret <= b[0].t)
		{
			vector[0] = maxim(pret - C, 0);
		}
		else
		{
			vector[0] = 0;
		}

		for (int j = 1; j < N; ++j)
		{
			if (pret <= b[j].t)
			{
				vector[j] = maxim(pret - C, vector[j - 1] - ((b[j].p - b[j - 1].p) * C) + pret);
			}
			else
			{
				vector[j] = maxim(0, vector[j - 1] - (b[j].p - b[j - 1].p) * C);
			}
		}

		for (int j = 0; j < N; ++j)
		{
			if (vector[j] > max)
			{
				max = vector[j]; 
			}
		}
	}

	fprintf(g, "%lld", max);
	fclose(g);


	return 0;
}