Cod sursa(job #146860)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 2 martie 2008 12:12:13
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<stdio.h>
struct nod{long info;nod *next;};
nod *st[100001],*p;
long n,i,j,x[100001],s[100001],d[100001],aux1,dr[10001];
long long c[100001],aux2,cmin[100001],i8,cc;
void hd(long ic,long nc);
void sh(long i1,long i2);
void get_st(long ii);
void get_dr(long ii);
int main()
{
	FILE *f,*g;f=fopen("stalpi.in","r");g=fopen("stalpi.out","w");
	fscanf(f,"%ld",&n);
	for(i=1;i<=n;i++)fscanf(f,"%ld%lld%ld%ld",&x[i],&c[i],&s[i],&d[i]);
	for(i=1;i<=n;i++){s[i]=x[i]-s[i];d[i]=x[i]+d[i];}
	for(i=n/2;i>=1;i--)hd(i,n);
	for(i=n;i>=1;i--){sh(1,i);hd(1,i-1);}
	for(i=1;i<=n;i++)
	{ get_st(i);get_dr(i);}
	i8=100000;i8*=i8;
	for(i=1;i<=n;i++)cmin[i]=i8;
	for(i=1;i<=n;i++)
	{ for(p=st[i];p;p=p->next)
	  { cc=cmin[i-1]+c[p->info];
	    for(j=dr[p->info];j>=i;j--)
	    { if(cmin[j]<=cc)break;
	      cmin[j]=cc;
	    }
	  }
	}
	fprintf(g,"%lld\n",cmin[n]);
        fcloseall();
	return 0;
}
void hd(long ic,long nc)
{
	long is,is1;is=2*ic;is1=is+1;
	if(is>nc)return;
	if(is<nc)if(x[is1]>x[is])is=is1;
	if(x[is]>x[ic]){sh(is,ic);hd(is,nc);}
}
void sh(long i1,long i2)
{
	aux1=x[i1];x[i1]=x[i2];x[i2]=aux1;
	aux1=s[i1];s[i1]=s[i2];s[i2]=aux1;
	aux1=d[i1];d[i1]=d[i2];d[i2]=aux1;
	aux2=c[i1];c[i1]=c[i2];c[i2]=aux2;
}
void get_st(long ii)
{       long ll,rr,mm;
	ll=1;rr=ii;
	while(x[ll]<s[ii])
	{ mm=(ll+rr)/2;
	  if(x[mm]<=s[ii])ll=mm;
	  if(x[mm]>=s[ii])rr=mm;
	}
	p=new nod;
	p->info=ii;
	p->next=(st[ii])?st[ii]:0;
	st[ll]=p;
}
void get_dr(long ii)
{       long ll,rr,mm;
	ll=ii;rr=n;
	while(x[rr]>d[ii])
	{ mm=(ll+rr)/2;
	  if(x[mm]<=d[ii])ll=mm;
	  if(x[mm]>=d[ii])rr=mm;
	}
	dr[ii]=rr;
}