Pagini recente » Cod sursa (job #2334987) | Cod sursa (job #1719657) | Cod sursa (job #277761) | Cod sursa (job #1866818) | Cod sursa (job #2204166)
#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;
}