Cod sursa(job #1751904)

Utilizator ArkinyStoica Alex Arkiny Data 2 septembrie 2016 12:20:38
Problema Heavy metal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<fstream>
#include<algorithm>
using namespace std;

ifstream in("heavymetal.in");
ofstream out("heavymetal.out");

#define MAX 100001
int v1[MAX],v2[MAX], l[MAX], D[MAX], AIB[MAX], N;
int a[MAX], b[MAX],c[MAX];

void update(int x, int v)
{
	for (;x <= N;x += x&(-x))
		if (D[v] > D[AIB[x]])
			AIB[x] = v;
}
int query(int x)
{
	int mx = 0;
	for (;x;x -= x&(-x))
		if (D[AIB[x]] > D[mx])
			mx = AIB[x];
	return mx;
}

bool cmp(int i, int j)
{
	if (a[i] == a[j])
		return b[i] < b[j];
	else
		return a[i] < a[j];
}

int main()
{
	int i;
	in >> N;
	for (int i = 1;i <= N;++i)
	{
		in >> a[i]>>b[i];
		c[i] = i;
		l[i] = a[i];
	}
	for (int i = N + 1;i <= 2 * N;++i)
		l[i] = b[i];

	sort(c + 1, c + N + 1, cmp);

	sort(l + 1, l + N + 1);

	int length = 1;
	for (i = 2;i <= N*2;++i)
		if (l[length] < l[i])
			l[++length] = l[i];

	for (i = 1;i <= N;++i)
		v1[i] = lower_bound(l + 1, l + length + 1, a[c[i]]) - l;

	for (i = 1;i <= N;++i)
		v2[i] = lower_bound(l + 1, l + length + 1, b[c[i]]) - l;

	for (i = 1;i <= N;++i)
	{
		D[i] = D[query(v1[i])] + b[c[i]]-a[c[i]];
		update(v2[i], i);
	}
	int max = 1;
	for (i = 2; i <= N; ++i)
		if (D[max] < D[i])
			max = i;
	out << D[max] << '\n';

	return 0;
}