1 #include <stdio.h>
2 #include <algorithm>
3
4 using namespace std;
5
6 const int _N = 550000;
7 const int INF = 1e9;
8
9 int A[_N];
10 int n, m;
11
12 struct node {
13 int l, r, c_l, c_r, max, sum, mid;
14 void set_lr(int _l, int _r) { l = _l; r = _r; mid = l+r>>1; return; }
15 void set_val(int _v) { c_l = c_r = max = sum = _v; return; }
16 } T[_N << 3];
17
18 void _update(int p)
19 {
20 T[p].c_l = max(T[p<<1].c_l, T[p<<1].sum+T[p<<1|1].c_l);
21 T[p].c_r = max(T[p<<1|1].c_r, T[p<<1|1].sum+T[p<<1].c_r);
22 T[p].max = max(max(T[p<<1].max, T[p<<1|1].max), T[p<<1].c_r+T[p<<1|1].c_l);
23 T[p].sum = T[p<<1].sum + T[p<<1|1].sum;
24 return;
25 }
26
27 void _init(int p, int x, int y)
28 {
29 T[p].set_lr(x, y);
30 if (x == y){ T[p].set_val(A[x]); return; }
31 _init(p<<1, x, T[p].mid), _init(p<<1|1, T[p].mid+1, y);
32 _update(p);
33 return;
34 }
35
36 //返回 [x, y] 中从线段 p 左端开始的连续最大和
37 int _begin_l(int p, int y)
38 {
39 if (T[p].r <= y) return T[p].c_l;
40 if (y <= T[p].mid) return _begin_l(p<<1, y);
41 return max(_begin_l(p<<1, y), T[p<<1].sum+_begin_l(p<<1|1, y));
42 }
43
44 int _begin_r(int p, int x)
45 {
46 if (T[p].l >= x) return T[p].c_r;
47 if (x > T[p].mid) return _begin_r(p<<1|1, x);
48 return max(_begin_r(p<<1|1, x), T[p<<1|1].sum+_begin_r(p<<1, x));
49 }
50
51 int _query(int p, int x, int y)
52 {
53 if (x <= T[p].l && T[p].r <= y) return T[p].max;
54 int maxx = -INF;
55 if (x <= T[p].mid && y >= T[p].l) maxx = max(maxx, _query(p<<1, x, y));
56 if (x <= T[p].r && y > T[p].mid) maxx = max(maxx, _query(p<<1|1, x, y));
57 if (x <= T[p].mid && T[p].mid < y) maxx = max(maxx, _begin_r(p<<1, x)+_begin_l(p<<1|1, y));
58 return maxx;
59 }
60
61 void _modify(int p, int x, int y)
62 {
63 if (T[p].l == T[p].r) { T[p].set_val(y); return ; }
64 if (x <= T[p].mid) _modify(p<<1, x, y);
65 else _modify(p<<1|1, x, y);
66 _update(p);
67 return;
68 }
69
70 int main()
71 {
72 int i;
73 scanf("%d%d", &n, &m);
74 for (i = 1; i <= n; ++i)
75 scanf("%d", &A[i]);
76 _init(1, 1, n);
77 while (m--) {
78 int ins, t1, t2;
79 scanf("%d%d%d", &ins, &t1, &t2);
80 if (ins == 1)
81 printf("%d\n", t1 <= t2 ? _query(1, t1, t2) : _query(1, t2, t1));
82 else
83 _modify(1, t1, t2);
84 }
85 return 0;
86 }