Cod sursa(job #196213)

Utilizator gcosminGheorghe Cosmin gcosmin Data 24 iunie 2008 20:53:27
Problema Gardieni Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
#include <algorithm>
using namespace std;

#define ff first
#define ss second
#define NMAX 50010

int N, T;

int nev;
pair <int, pair<int, int> > ev[NMAX * 2];

int n;
int cst[20];
int jeg[20];

void baga(int val, int poz)
{
	n++;
	cst[n] = val;
	jeg[n] = poz;
}

void scoate(int poz)
{
	int i;
	for (i = 1; i <= n && jeg[i] != poz; i++);

	swap(cst[i], cst[n]);
	swap(jeg[i], jeg[n]);
	n--;
}

int get_min()
{
	int i, mn = 1 << 21;

	for (i = 1; i <= n; i++) mn = min(mn, cst[i]);

	return mn;
}

int main()
{
	int i, x, y, c;

	freopen("gardieni.in", "r", stdin);
	freopen("gardieni.out", "w", stdout);

	scanf("%d %d", &N, &T);

	for (i = 1; i <= N; i++) {
		scanf("%d %d %d", &x, &y, &c);
		nev++;
		ev[nev].ff = x;
		ev[nev].ss.ff = i;
		ev[nev].ss.ss = c;
		nev++;
		ev[nev].ff = y;
		ev[nev].ss.ff = -i;
		ev[nev].ss.ss = c;
	}

	sort(ev + 1, ev + nev + 1);

	int j = 1, jj;
	long long rez = 0;
	for (i = 1; i <= T; i++) {
		for (jj = j; jj <= nev && ev[jj].ff == i; jj++)
			if (ev[jj].ss.ff > 0) baga(ev[jj].ss.ss, ev[jj].ss.ff);

		rez += get_min();

		for (jj = j; jj <= nev && ev[jj].ff == i; jj++)
			if (ev[jj].ss.ff < 0) scoate(-ev[jj].ss.ff);

		j = jj;
	}

	printf("%lld\n", rez);

return 0;
}