Cod sursa(job #2204166)

Utilizator GarboteialexGarbotei Alex Garboteialex Data 14 mai 2018 20:26:21
Problema Secventa 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>

using namespace std;

#define DM 50000

ifstream fin("secv2.in");
ofstream fout("secv2.out");

int n,k,val[DM + 1];
int sp[DM + 1];
int c1,c2,ans = -125000000;
deque < pair < int, int > > minDq,maxDq;

void make_sp() {
    sp[0] = val[1];
    for(int i = 2; i <= n; i++) {
        sp[i] = sp[i - 1] + val[i];
    }
}

void make_min(int crEl, int i) {
    while(!minDq.empty() && minDq.back().first >= crEl) {
        minDq.pop_back();
    }

    minDq.push_back(make_pair(crEl, i));
}

void make_max(int crEl, int i) {
    while(!maxDq.empty() && maxDq.back().first <= crEl) {
        maxDq.pop_back();
    }

    maxDq.push_back(make_pair(crEl, i));
}

void solve() {
    for(int i = 1; i <= n; i++) {
        make_min(sp[i], i);
        make_max(sp[i], i);

        if(maxDq.front().second > minDq.front().second && maxDq.front().first - minDq.front().first > ans) {
            ans = maxDq.front().first - minDq.front().first;
            c1 = minDq.front().second + 1;
            c2 = maxDq.front().second;
        }
    }
}

int main() {
    fin >> n >> k;
    for(int i = 1; i <= n; i++) {
        fin >> val[i];
    }

    make_sp();
    solve();

    fout << c1 << " " << c2 << " " << ans;
}