#include <bits/stdc++.h> using namespace std; struct Node { int Pre, Max, Suf,Sum; int Left, Right; }; struct Node SegTree[100]; int c[100] = {0,45,88,5,2,-8,-7,88,-9}; void Built(int k, int L, int R) { SegTree[k].Left = L; SegTree[k].Right = R; if(L == R) { SegTree[k].Max = c[L]; SegTree[k].Suf = c[L]; SegTree[k].Pre = c[L]; SegTree[k].Sum = c[L]; return; } int Mid = (SegTree[k].Left+SegTree[k].Right)/2; Built(k<<1, L, Mid); Built(k<<1 | 1, Mid+1, R); SegTree[k].Max = max(max(SegTree[k<<1].Max, SegTree[k<<1 | 1].Max), SegTree[k<<1].Suf+SegTree[k<<1 | 1].Pre); SegTree[k].Suf = SegTree[k<<1 | 1].Suf; if(SegTree[k<<1 | 1].Suf == SegTree[k<<1 | 1].Sum) SegTree[k].Suf = max(SegTree[k].Suf, SegTree[k<<1 | 1].Max+SegTree[k<<1].Suf); SegTree[k].Pre = SegTree[k<<1].Pre; if(SegTree[k<<1].Pre == SegTree[k<<1].Sum) SegTree[k].Pre = max(SegTree[k].Pre, SegTree[k<<1].Max+SegTree[k<<1 | 1].Pre); SegTree[k].Sum = SegTree[k<<1].Sum + SegTree[k<<1 | 1].Sum; } void Updata(int k, int dir, int num) { if(SegTree[k].Left == SegTree[k].Right) { SegTree[k].Max = num; SegTree[k].Pre = num; SegTree[k].Suf = num; SegTree[k].Sum = num; return; } int Mid = (SegTree[k].Left + SegTree[k].Right)/2; if(dir <= Mid) Updata(k<<1, dir, num); if(dir > Mid) Updata(k<<1 | 1, dir, num); SegTree[k].Max = max(max(SegTree[k<<1].Max , SegTree[k<<1 | 1].Max), SegTree[k<<1].Suf + SegTree[k<<1 | 1].Pre); SegTree[k].Pre = SegTree[k<<1].Pre; if(SegTree[k<<1].Pre == SegTree[k<<1].Sum) SegTree[k].Pre = max(SegTree[k].Pre, SegTree[k<<1].Pre+SegTree[k<<1 | 1].Pre); SegTree[k].Suf = SegTree[k<<1 | 1].Suf; if(SegTree[k<<1 | 1].Suf == SegTree[k<<1 | 1].Sum) SegTree[k].Suf = max(SegTree[k].Suf, SegTree[k<<1 | 1 ].Suf+SegTree[k<<1].Suf); SegTree[k].Sum = SegTree[k<<1].Sum + SegTree[k<<1 | 1].Sum; } struct Node Query(int k, int L, int R) { if(L <= SegTree[k].Left && SegTree[k].Right <= R) return SegTree[k]; int Mid = (SegTree[k].Left + SegTree[k].Right) >> 1; struct Node Node1, Node2, ans; int tag1 = 0; int tag2 = 0; if(L <= Mid) { Node1 = Query(k<<1, L, R); tag1 = 1; } if(Mid < R) { Node2 = Query(k<<1 | 1, L, R); tag2 = 1; } if(tag1 && tag2) { ans.Max = max(max(Node1.Max , Node2.Max), Node1.Suf + Node2.Pre); ans.Pre = Node1.Pre; if(Node1.Pre == Node1.Sum) ans.Pre = max(ans.Pre, Node1.Pre+Node2.Pre); ans.Suf = Node2.Suf; if(Node2.Suf == Node2.Sum) ans.Suf = max(ans.Suf, Node2.Suf+Node1.Suf); ans.Sum = Node1.Sum + Node2.Sum; }else { ans = tag1 ? Node1 : Node2; } return ans; } int main(void) { Built(1, 1, 8); // Updata(1, 6, 99); cout << Query(1, 2, 5).Max << endl; cout << "Yes" <<endl; return 0; }