Cod sursa(job #721122)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 23 martie 2012 12:15:52
Problema Gardieni Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <stdio.h>
#include <list>
#include <vector>
#include <algorithm>
using namespace std;

const int dim = 100100;
int N, T, nm, R;
struct paza { int x, y, c; } A[dim];
struct inv {
	int i;
	vector <int> c;
} norm[dim];
list <int> L;

int cmp (inv a, inv b)
{
	return a.i < b.i;
}

void elim_dubl (inv A[], int &n)
{
	int i, j;
	for (i = 2, j = 1; i <= n; i++)
		if (A[i].i != A[j].i)
			A[++j] = A[i];
	n = j;	
}

int cauta (int val)
{
	int p = 1, u = nm, m;
	while (p <= u)
	{
		m = (p + u) >> 1;
		if (val == norm[m].i)
			return m;
		
		if (val > norm[m].i)
			p = m + 1;
		else
			u = m - 1;
	}
}

void cit ()
{
	scanf ("%d%d", &N, &T);
	for (int i = 1; i <= N; i++)
	{
		scanf ("%d%d%d", &A[i].x, &A[i].y, &A[i].c);
		
		norm[++nm].i = A[i].x;
		norm[++nm].i = A[i].y + 1;
	}
	sort (norm + 1, norm + 1 + nm, cmp);
	elim_dubl (norm, nm);
	for (int i = 1, p; i <= N; i++)
	{
		p = cauta (A[i].x);
		norm[p].c.push_back (A[i].c);
		
		p = cauta (A[i].y + 1);
		norm[p].c.push_back (-A[i].c);
	}
}

int bst ()
{
	int mn = 1<<30;
	for (list <int> :: iterator it = L.begin (); it != L.end (); it++)
	{
		mn = min (mn, *it);
	}
	return mn;
}

void ins (int c)
{
	L.push_back (c);
}

void del (int c)
{
	for (list <int> :: iterator it = L.begin (); it != L.end (); it++)
		if (*it == c)
		{
			L.erase (it);
			return;
		}
}

void modif (int n)
{
	for (int i = 0, x; i < norm[n].c.size(); i++)
	{
		x = norm[n].c[i];
		if (x > 0)
			ins (x);
		else
			del (-x);
	}		
}

void rez ()
{	
	modif (1);
	for (int i = 2; i <= nm; i++)
	{
		R += bst () * (norm[i].i - norm[i-1].i);
		modif (i);
	}
	
	printf ("%d", R);
}

int main ()
{
	freopen ("gardieni.in", "r", stdin);
	freopen ("gardieni.out", "w", stdout);
	
	cit ();
	rez ();
	
	return 0;
}