Pagini recente » Cod sursa (job #738766) | Cod sursa (job #2045702) | Cod sursa (job #983846) | Monitorul de evaluare | Cod sursa (job #245592)
Cod sursa(job #245592)
#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;
}