线段树写挂了,样例没过
查看原帖
线段树写挂了,样例没过
784175
Judging_zhu楼主2024/7/24 13:57
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>
#include <cstring>
#include <map>
#include <memory>
using namespace std;
const int N=100000;
long long n,t,a[N+5],tr[4*N+5];
void pushup(int rt){
	tr[rt]=tr[rt<<1]+tr[rt<<1|1];
}
void build(int l,int r,int rt){
	if(l==r){
		tr[rt]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
	pushup(rt);
}
void change(int rt,int l,int r,int x,int y,int k){
	if(l==x&&r==y){
		tr[rt] += k;
		return ;
	}
	int mid=(l+r)>>1;
	if(y<=mid)change(rt<<1,l,mid,x,y,k);
	else if(x > mid) change(rt<<1|1,mid+1,r,x,y,k);
	else {
		change(rt<<1,l,mid,x,mid,k);
		change(rt<<1|1,mid+1,r,mid+1,y,k);
	}
}
int f3(int l,int r,int rt,int L,int R){
	if(L<=l&&r<=R){
		return tr[rt];
	}
	int mid=(l+r)>>1;
	if(R<=mid)return f3(l,mid,rt<<1,L,R);
	else if(L>mid) return f3(mid+1,r,rt<<1|1,L,R);
	else return f3(l,mid,rt<<1,L,mid)+f3(mid+1,r,rt<<1|1,mid+1,R);
}
int main(){
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;i++)scanf("%d",a+i);
	build(1,n,1);
	while(t--){
		int opt,x,y;
		cin>>opt>>x>>y;
		if(opt==1){
			int k;
			cin>>k;
			change(1,1,n,x,y,k);
		}
		if(opt==2)
			cout<<f3(1,n,1,x,y)<<endl;
	}
	return 0;
}/*
样例输出:
11
6
12
*/
2024/7/24 13:57
加载中...