Cod sursa(job #115119)

Utilizator IoannaPandele Ioana Ioanna Data 16 decembrie 2007 10:58:34
Problema Operatii Scor 80
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasa a 9-a Marime 1.74 kb
#include<stdio.h>
#include<values.h>
long nrop,n,k,nmax,nmin,max,min,c;
long v[1000002];

void read()
{
scanf("%ld",&n);
long i;
i=0;
while (i<=n)
      {scanf("%ld",&v[++i]);
      if (v[i])
	 k++;
      }
}
void secv(long inc,long sf)
{
long i;
if (c!=2)
   {
    nrop+=max;
    k=k-(sf-inc+1);
    i=inc;
    while (i<=sf)
	  {v[i]=0;
	  i++;
	  }
   }
else {
      nrop+=min;
       k-=nmin;
       i=inc;
       while (i<=sf)
	    {v[i]-=min;
	    i++;
	    }
	}
}

void rez()
{
min=MAXLONG;

max=0;
nmin=0;
nmax=0;
long i,j,inc;
while (k)
     {i=1;
      c=0;
      while (i<=n)
	    {
	     if (v[i] && v[i+1])
		{if (max==0)
		     inc=i;
		 if (min>v[i])
		    {min=v[i];
		    nmin=1;
		    }
		else if (min==v[i])
			 nmin++;
	       if (max<v[i])
		    {max=v[i];
		    nmax=1;
		    }
		else if (max==v[i])
			 nmax++;

		 if (c!=2)
		    if (c==0)
		       {
		       if (v[i]<v[i+1] && v[i+1])
			   c=-1;
		       else if (v[i]>v[i+1] && v[i+1])
			       c=1;
			}
		   else if (c==1)
			   {if (v[i]<v[i+1] && v[i+1])
			       c=2;
			       }
		   else if (c==-1)
			  {if (v[i]>v[i+1] && v[i+1])
			     c=2;
			  }
		}
	    else { if (v[i])
		 {
		 if (max==0)
		    inc=i;
		  if (min>v[i])
		    {min=v[i];
		    nmin=1;
		    }
		else if (min==v[i])
			 nmin++;
	       if (max<v[i])
		    {max=v[i];
		    nmax=1;
		    }
		else if (max==v[i])
			 nmax++;

		 secv(inc,i);
		 c=0;
		 nmax=nmin=0;
		 max=0;
		 min=MAXLONG;}
		 }
	       i++;
	    }
     }
}

void af()
{
printf("%ld",nrop);
}

int main()
{
freopen("operatii.in","r",stdin);
freopen("operatii.out","w",stdout);
read();
rez();
af();
fcloseall();
return 0;
}