Cod sursa(job #126718)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 22 ianuarie 2008 18:41:35
Problema Gardieni Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>
#include<string.h>
FILE*fin=fopen("gardieni.in","r");
FILE*fout=fopen("gardieni.out","w");
#define maxt 1000000
long long t,a,b,c,n;
long long v[2*maxt];
void build()
{
 memset(v,-1,sizeof(v));
}
void update(long long nod,long long st,long long dr)
{
	long long mij=(st+dr)/2;
	if(a<=st && dr<=b)
	{
		if(v[nod]==-1)
		{
			v[nod]=c*(dr-st+1);
			if (dr>st)
			{
				update(nod*2,st,mij);
				update(nod*2+1,mij+1,dr);
			}
		}
		else
			if(v[nod]>c*(dr-st+1))
			{
				v[nod]=c*(dr-st+1);
				if (dr>st)
				{
					update(nod*2,st,mij);
					update(nod*2+1,mij+1,dr);
				}
			}
	}
	else
	{
		long long ls=nod*2;
		long long rs=ls+1;
		if(a<=mij) update(ls,st,mij);
		if(b>=(mij+1)) update(rs,mij+1,dr);
		if(v[ls]!=-1&&v[rs]!=-1) if(v[nod]==-1) v[nod]=v[ls]+v[rs];
					 else if(v[nod]>(v[ls]+v[rs])) v[nod]=v[ls]+v[rs];
	}
}
int main()
{
long long i;
fscanf(fin,"%lld",&n);
fscanf(fin,"%lld",&t);
build();
for(i=1;i<=n;i++)
{
	fscanf(fin,"%lld %lld %lld",&a,&b,&c);
	printf("%lld %lld %lld\n",a,b,c);
	update(1,1,t);
}
fprintf(fout,"%lld",v[1]);
fclose(fin);
fclose(fout);
return 0;}