Cod sursa(job #146995)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 2 martie 2008 14:47:40
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include<stdio.h>
struct nod{long info;nod *next;};
nod *st[101],*p;
long n,i,j,x[101],a[101],b[101],aux1,dr[101],aa,bb,zero,sst;
long long c[101],va[101],vb[101],aux2,i8,cc,c_old,c_new;
void hd(long ic,long nc);
void sh(long i1,long i2);
void cauta1(long val,long ll,long rr);
void pune(long i1,long i2);
void cauta2(long val,long ll,long rr);
void get_dr(long ii);
void make_arb();
long long get_cmin(long ii,long poz);
void update(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],&a[i],&b[i]);
	for(i=1;i<=n;i++){a[i]=x[i]-a[i];b[i]=x[i]+b[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++)
	{ if(a[i]<=x[1]) sst=1;
	  else cauta1(a[i],1,n);
	  pune(sst,i);
	  if(b[i]>=x[n]) dr[i]=n;
	  else cauta2(b[i],1,n);
	}
	i8=100000;i8*=i8;
	make_arb();
	for(i=1;i<=n;i++)
	{ c_old=get_cmin(i-1,1);aa=i;
	  for(p=st[i];p;p=p->next)
	  { c_new=c_old+c[p->info];
	    bb=dr[p->info];
	    update(1);
	  }
	}
	fprintf(g,"%lld\n",get_cmin(n,1));
	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=a[i1];a[i1]=a[i2];a[i2]=aux1;
	aux1=b[i1];b[i1]=b[i2];b[i2]=aux1;
	aux2=c[i1];c[i1]=c[i2];c[i2]=aux2;
}
void cauta1(long val,long ll,long rr)
{       long mm;
	if(val>x[rr])return;
	if(val<x[ll])return;
	if(x[ll]==val){sst=ll;return;}
	if(x[rr]==val){sst=rr;return;}
	if(rr==ll+1){sst=rr;return;}
	mm=(ll+rr)/2;
	cauta1(val,ll,mm);
	cauta1(val,mm+1,rr);
}
void cauta2(long val,long ll,long rr)
{       long mm;
	if(val>x[rr])return;
	if(val<x[ll])return;
	if(x[ll]==val){dr[i]=ll;return;}
	if(x[rr]==val){dr[i]=rr;return;}
	if(rr==ll+1){dr[i]=ll;return;}
	mm=(ll+rr)/2;
	cauta2(val,ll,mm);
	cauta2(val,mm+1,rr);
}
void make_arb()
{
	long zero,fs,fd;
	zero=1;
	while(zero<n+1)zero<<=1;
	for(i=0;i<zero;i++)
	 { a[zero+i]=i;
	   b[zero+i]=i;
	   va[zero+i]=i8;
	   vb[zero+i]=i8;
	 }
	vb[zero]=0;va[zero]=0;
	for(i=zero-1;i>=1;i--)
	{ fs=i<<1;fd=fs|1;
	  a[i]=a[fs];b[i]=b[fs];
	  va[i]=va[fs];vb[i]=vb[fd];
	}
}
long long get_cmin(long ii,long poz)
{
	if(va[poz]==vb[poz]) return va[poz];
	if(ii<=b[poz<<1])return get_cmin(ii,poz<<1);
	return get_cmin(ii,(poz<<1)|1);
}
void update(long ii)
{
	if(bb<a[ii])return;
	if(aa>b[ii])return;
	if(bb>=b[ii]&&aa<=a[ii])
	 { va[ii]=(va[ii]<c_new)?va[ii]:c_new;
	   vb[ii]=(vb[ii]<c_new)?vb[ii]:c_new;
	   if(va[ii]==vb[ii])return;
	 }
	update(ii<<1);
	update((ii<<1)|1);
}
void pune(long i1,long i2)
{
	p=new nod;
	p->info=i2;
	p->next=(st[i1])?st[i1]:0;
	st[i1]=p;
}