样例都过不了。。。
#include<bits/stdc++.h>
using namespace std;
const int inf = 2e9;
struct node
{
long long l,r;
long long ans,maxl,minl,maxr,minr,sum;
}t[800010];
int a[200010];
inline long long max3(long long a,long long b,long long c){return max(max(a,b),c);}
inline long long min3(long long a,long long b,long long c){return min(min(a,b),c);}
inline long long max4(long long a,long long b,long long c,long long d){return max(max(a,b),max(c,d));}
inline long long min4(long long a,long long b,long long c,long long d){return min(min(a,b),min(c,d));}
inline void check(long long &x) {
if(x > inf) x = inf;
if(x < -inf) x = -inf;
}
inline void pushup(node T,node T1,node T2)
{
T.maxl = max3(T1.maxl, T1.sum * T2.maxl, T1.sum * T2.minl); check(T.maxl);
T.maxr = max3(T2.maxr, T2.sum * T1.maxr, T2.sum * T1.minr); check(T.maxr);
T.minl = min3(T1.minl, T1.sum * T2.maxl, T1.sum * T2.minl); check(T.minl);
T.minr = min3(T2.minr, T2.sum * T1.maxr, T2.sum * T1.minr); check(T.minr);
T.sum = T1.sum * T2.sum; check(T.sum);
T.ans = max4(T1.ans, T2.ans, T1.maxr * T2.maxl, T1.minr * T2.minl); check(T.ans);
}
void build(int c,int l,int r)
{
t[c].l = l; t[c].r = r;
if(l == r)
{
t[c].maxl = t[c].maxr = max(1,a[l]);
t[c].minl = t[c].minr = min(1,a[l]);
t[c].ans = max(1,a[l]);
t[c].sum = a[l];
return ;
}
int mid = (l + r) / 2;
build(c*2,l,mid);
build(c*2+1,mid+1,r);
pushup(t[c],t[c*2],t[c*2+1]);
}
void update(int c,int x,int v)
{
if(t[c].l == t[c].r)
{
t[c].maxl = t[c].maxr = max(1,v);
t[c].minl = t[c].minr = min(1,v);
t[c].ans = max(1,v);
t[c].sum = v;
return ;
}
int mid = (t[c].l + t[c].r) / 2;
if(x <= mid) update(c*2,x,v);
if(x > mid) update(c*2+1,x,v);
pushup(t[c],t[c*2],t[c*2+1]);
}
node query(int c, int x, int y)
{
node T;
if(t[c].l >= x && t[c].r <= y) return t[c];
int mid = (t[c].l + t[c].r) / 2;
if(y <= mid) return query(c*2, x, y);
if(mid < x) return query(c*2 + 1, x, y);
pushup(T,query(c*2,x,y),query(c*2+1,x,y));
return T;
}
int main() {
int n, q;
cin >> n >> q;
for(int i = 1;i <= n;i++) cin >> a[i];
build(1,1,n);
while(q--)
{
int opt, x, y;
cin >> opt >> x >> y;
if(opt == 1) update(1,x,y);
if(opt == 2)
{
node T = query(1,x,y);
if(T.ans > (1 << 30)) cout << "Too large" << endl;
else cout << T.ans << endl;
}
}
return 0;
}