Cod sursa(job #245592)

Utilizator SheepBOYFelix Liviu SheepBOY Data 18 ianuarie 2009 13:14:18
Problema Operatii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
    #include<stdio.h>  
	int v[1000000];
	int rq(int p,int q,int k,int &ft)
	{
		int a=0,min=k,returned=0,i=0,change=0,e=0,rbs,frt;
		if(!k)
		{
			min=v[p];
			for(i=p+1;i<=q;++i)
				if(min>v[i])
					min=v[i];
		k=min;
		}
		
		ft=k;
		do
		{
			change=0;
			for(i=p;i<=q;++i)
			{
				if(v[i]-k>=0)
				{
					v[i]-=k;
					if(min>v[i]&&v[i])
						min=v[i];
					change=1;
					e=0;
					if(!v[i]&&i==p)
						{++p;e=1;}
					if(!v[i]&&i==q)
						{--q;e=1;}
				}
				if(!v[i])
				{
					change=1;
					if(!e)
					{
						returned+=rq(p,i-1,min,rbs);
						a=rq(i+1,q,0,frt);
						if(ft==frt)
							returned=returned+(a-frt);
						if(ft<frt)
							returned=returned+(a-ft);
						if(ft>frt)
							returned+=a;
						p=q+1;
						break;
					}
				}
			}
			if(change)
				returned+=k;
			
			k=min;
			min=k;
		}
		while(p<=q);
			return returned;
	}
    int main()  
    {  
		long long sum=0;
        int n,max=0,min=0,entr=0,p,q;  
        freopen("operatii.in","r",stdin);  
        freopen("operatii.out","w",stdout);  
        scanf("%d",&n);  
      int put=1;  
       for(int i=0;i<n;++i)  
	   {
			scanf("%d",v+i);
			entr=0;
			min=0;
			if(v[i])
			{
				p=i;
				if(!min)
					min=v[i];
			}
			while(v[i]&&i!=n)
			{
				if(!entr)
				entr=1;
				
				if(min>v[i])
				min=v[i];
				
				++i;
				scanf("%d",v+i);
			}
			if(entr)
			{
				q=i-1;
				sum+=rq(p,q,min,max);
			}
	   }
     printf("%d",sum);  
     return 0;  
 }