悬赏关注
  • 板块灌水区
  • 楼主2b2b2bbb
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/18 11:41
  • 上次更新2025/1/18 14:50:48
查看原帖
悬赏关注
996107
2b2b2bbb楼主2025/1/18 11:41

线段树,满江红,求助。 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;
}
2025/1/18 11:41
加载中...