Here is my code:
/**
- code generated by JHelper
- More info: GitHub - AlexeyDmitriev/JHelper
-
@author
*/
#include
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define MAXN1 (1<<16)
#define MAXN2 (MAXN1 << 2)
struct data{
long long sum,pref,suff,ans;
};
data t[MAXN2];
int a[MAXN1];
class CanYouAnswerTheseQueriesI {
public:
data combine(data l, data r){
data res;
res.sum = l.sum + r.sum;
res.pref = max(l.pref, l.sum+r.pref);
res.suff = max(r.suff, r.sum+l.suff);
res.ans = max(max(l.ans,r.ans),l.suff+r.pref);
return res;
}
data make_data(int val){
data res;
res.sum = val;
res.pref = res.suff = res.ans = max(0,val);
return res;
}
void build(int v, int tl, int tr){
if(tl == tr){
t[v] = make_data(a[tl]);
}
else{
int tm = (tl+(tr-tl))/2;
build(v*2,tl,tm);
build(v*2+1,tm+1,tr);
t[v] = combine(t[v*2],t[v*2+1]);
}
}
data query(int v, int tl,int tr, int l, int r){
if(l > r)return make_data(0);
if(l == tl && r == tr)return t[v];
int tm = (tl + tr)/2;
return combine(query(v*2,tl,tm,l,min(r,tm)), query(v*2+1, tm+1, tr, max(l,tm+1),r));
}
void solve(std::istream& in, std::ostream& out) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
in >> n;
for(int i=0;i<n;i++)in >> a[i];
build(1,0,n-1);
int m;
in >> m;
while(m--){
int l,r;
in >> l >> r;
out << query(1,1,n,l,r).ans << endl;
}
}
};
int main() {
CanYouAnswerTheseQueriesI solver;
std::istream& in(std::cin);
std::ostream& out(std::cout);
solver.solve(in, out);
return 0;
}