线段树,满江红,求助。 P4513 小白逛公园
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,x,y;
int maxn;
int a[500005];
int t[2000005];
void tree(int l,int r,int k){
t[k] = -1e9;
if(l == r){
t[k] = a[l];
return;
}
int mid = (l + r) / 2;
tree(l , mid , k * 2);
tree(mid + 1 , r , k * 2 + 1);
t[k] = t[k * 2] + t[k * 2 + 1];
return ;
}
void tt(int l,int r,int k){
if(l == r){
t[k] = y;
return ;
}
int mid = (l + r) / 2;
if(x <= mid){
tt(l , mid , k * 2);
}
if(x >= mid + 1){
tt(mid + 1 , r , k * 2 + 1);
}
t[k] = t[k * 2] + t[k * 2 + 1];
}
int check(int l,int r,int k){
if(l >= x && y >= r){
return t[k];
}
int mid = (l + r) / 2;
int ans = -1;
int cnt = -1;
if(x <= mid){
cnt = check(l , mid , k * 2);
}
if(y >= mid + 1){
ans = check(mid + 1 , r , k * 2 + 1);
}
if(ans == -1){
return cnt;
}
if(cnt == -1){
return ans;
}
ans = max(max(ans , cnt) , ans + cnt);
t[k] = t[k * 2] + t[k * 2 + 1];
return ans;
}
signed main(){
// freopen("C.in" , "r" , stdin);
// freopen("C.out" , "w" , stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++){
cin >> a[i];
}
tree(1 , n , 1);
while(m --){
int opt;
cin >> opt >> x >> y;
if(opt == 1){
if(x > y)swap(x , y);
cout << check(1 , n , 1) << "\n";
}else{
tt(1 , n , 1);
}
}
return 0;
}