Cod sursa(job #3309308)

Utilizator Caleb_007Sighiartau Achim Caleb Caleb_007 Data 3 septembrie 2025 15:03:54
Problema Operatii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <stdio.h>
using namespace std;

//ifstream cin("operatii.in");
ofstream cout("operatii.out");

#include <stdio.h>
#include <ctype.h>

class InParser {
private:
	FILE *fin;
	char *buff;
	int sp;

	char read_ch() {
		++sp;
		if (sp == 4096) {
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}

public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[4096]();
		sp = 4095;
	}

	InParser& operator >> (int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}

	InParser& operator >> (long long &n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
};

int A[1000001];

long long s=0;
long long c=0;
long long nrOp(int st, int dr)
{
    c+=(dr-st);
    if(st<=dr)
    {
        int nmin=1e6,l=0,last=0;
        long long s=0;
        bool ok=1;
        for(int i=st;i<=dr;i++)
        {
            if(nmin>A[i]) nmin=A[i];
            if(i>st && A[i]<=A[i-1]) ok=0;
            s=s+A[i]-last;
            if(i<dr && A[i+1]!=A[i]) last=A[i];
           // cout<<A[i]<<" ";
        }
        if(ok) return s;
       //cout<<endl;
        for(int i=st;i<=dr;i++) A[i]-=nmin;
      //  for(int i=st;i<=dr;i++) cout<<A[i]<< " ";
      //  cout<<endl;
        s=nmin;
        for(int i=st;i<=dr;i++)
            if(A[i]!=0)
                l++;
            else
                s+=nrOp(i-l,i-1), l=0;
        if(l>0)
            s+=nrOp(dr-l+1,dr);
        return s;
    }
    return 0;

}


int main()
{
    int n;
    InParser cin("operatii.in");
    cin>>n;
    int l=0;

    for(int i=1;i<=n;i++)
        {
            cin>>A[i];
        }
    /*for(int i=1;i<=n;i++)
        {
            cout<<A[i]<<" ";
        }*/

    //cout<<endl;
    for(int i=1;i<=n;i++)
        if(A[i]==0)
            s=s+nrOp(i-l,i-1),l=0;
        else l++;
    s=s+nrOp(n-l+1,n);
    cout<<s;//<<" "<<c;
	return 0;
}