Cod sursa(job #426001)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 26 martie 2010 12:42:43
Problema Gardieni Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define INF 1<<30

using namespace std;

int i,j,n,t,dr,st,a,b,fol[1<<21];
int rez,ar[1<<20];

struct nod
{
	int c;
}x[55000];

vector<int> t1[1000005];

void update(int st ,int dr,int i,int val, int poz)
{
	if(st==dr) 
	{
		ar[i]=val;
		return ;
	}
	
	int mij=(st+dr)/2;
	
	if(poz<=mij) update(st,mij,i*2,val,poz);
	else update(mij+1,dr,i*2+1,val,poz);
	
	ar[i]=min(ar[i*2],ar[i*2+1]);
}

void update1(int st ,int dr,int i, int poz,int ok)
{
	if(st==dr) 
	{
		if(ok) 	ar[i]=INF;
		return ;
	}
	
	int mij=(st+dr)/2;
	
	if(poz<=mij) update1(st,mij,i*2,poz,ok);
	else update1(mij+1,dr,i*2+1,poz,ok);
	
	ar[i]=min(ar[i*2],ar[i*2+1]);
}

	

int main()
{
	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",&a,&b,&x[i].c);
	      t1[ a ].push_back(i);
		  t1[ b+1].push_back(-i);
		}
	
	for(i=0;i<1<<20;++i) ar[i]=INF;
	
	dr=0;st=1;
	
	for(i=1;i<=t;++i)
	{
		int m=t1[i].size();
		
		for(j=0;j<m;++j)
		{
			int ok=0;
			if(t1[i][j]>0)
			{
				int ind=t1[i][j];
				fol[ x[ind].c]++;
				update(1,n,1,x[ind].c,x[ind].c);
			}
			
			else if(t1[i][j]<0)
			{
				int ind=-t1[i][j];
				fol[x[ind].c]--;
				if(!fol[x[ind].c]) ok=1;
				update1(1,n,1,x[ind].c,ok);
			}
		}
		
		rez+=ar[1];
	}
	
	printf("%d\n",rez);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}