P4513 小白逛公园 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
![](https://i-blog.csdnimg.cn/blog_migrate/8fc9cfe9d8cddad1c96de0e0488359ee.png)
#include <bits/stdc++.h>
#include <iostream>
#include<unordered_map>
#define x first
#define y second
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef long long LL ;
typedef unsigned long long ULL ;
typedef pair<int,int> PII ;
typedef pair<LL,int> PLI ;
const int N = 1e6+10,mod = 1e9 + 7 ;
const LL INF2 = 1e17;
int n,m,w[N];
struct node{
int l,r;
int sum,lmax,rmax,tmax;
}tr[N * 4];
void pushup(node &u,node &l,node &r)
{
u.sum = l.sum + r.sum;
u.lmax = max(l.lmax,l.sum + r.lmax);
u.rmax = max(r.rmax,r.sum + l.rmax);
u.tmax = max(max(l.tmax,r.tmax),l.rmax + r.lmax);
}
void pushup(int u)
{
pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}
void build(int u,int l,int r)
{
if(l == r ) tr[u] = {l,r,w[r],w[r],w[r],w[r]};
else
{
tr[u]={l,r};
int mid = l + r >>1 ;
build(u << 1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
}
void modify(int u,int x,int v)
{
if(tr[u].l == x && tr[u].r == x ) tr[u] = {x,x,v,v,v,v};
else
{
int mid = tr[u].l + tr[u].r >> 1;
if(x <= mid ) modify(u << 1,x,v);
else modify(u<<1|1,x,v);
pushup(u);
}
}
node query(int u,int l,int r)
{
if(tr[u].l >= l && tr[u].r <= r ) return tr[u];
else
{
int mid = tr[u].l + tr[u].r >> 1;
if(r <= mid ) return query(u << 1,l,r);
else if(l > mid ) return query(u << 1|1,l,r);
else
{
auto left = query(u<<1,l,r);
auto right = query(u<<1|1,l,r);
node res;
pushup(res,left,right);
return res;
}
}
}
inline void solve()
{
cin >> n >> m ;
for(int i=1;i<=n; i++ ) cin >> w[i];
build(1,1,n);
int k,x,y;
while(m -- )
{
cin>>k>>x>>y;
if(k ==1 )
{
if(x > y ) swap(x,y);
cout << query(1,x,y).tmax << endl;
}
else
{
modify(1,x,y);
}
}
}
signed main()
{
ios
int T=1;
// cin>>T;
while(T -- )
{
solve();
}
return 0;
}