求助大佬,卡在最后三个点上了!
查看原帖
求助大佬,卡在最后三个点上了!
275091
wozixinmeng楼主2020/11/2 19:54
#include <iostream>
#include<queue>
#include <cstring>
#define MAX_LEN 400000
using namespace std;

void build_tree(int arr[],int tree[],int node,int start,int end){
	if(start == end){
		tree[node] = arr[start];
	}
	else{
		int mid = (start + end) /2; 
		int left_node =2 * node +1;
		int right_node = 2* node +2;
	
		build_tree(arr, tree,left_node,start,mid);
		build_tree(arr,tree,right_node,mid+1,end);
		tree[node] = tree[left_node] + tree[right_node];
	}
}

void update_tree(int arr[], int tree[],int node, int start, int end,int idx,int val){
	if(start == end){
		arr [idx] += val;
		tree[node] += val;
	}
	else{
		int mid = (start +end) /2;
		int left_node = 2 * node +1;
		int right_node = 2 * node +2;
		if(idx >= start && idx <= mid){
			update_tree(arr , tree , left_node , start , mid , idx , val);
		}
		else{
			update_tree(arr , tree , right_node , mid+1 , end, idx , val);
		}
		tree[node] = tree[left_node] + tree[right_node];
	}
}
	
int query_tree(int arr[], int tree[],int node, int start, int end,int L,int R){
	if(R < start || L >end){
		return 0;
	}
	else if(L<=start && end <= R){
		return tree[node];
	}
	else if(start == end){
		return tree[node];
	} 
	else{
		int mid = (start +end) /2;
		int left_node = 2 * node +1;
		int right_node = 2 * node +2;
		int sum_left = query_tree(arr,tree,left_node, start,mid,L,R);
		int sum_right =query_tree(arr,tree,right_node,mid+1,end,L,R); 
		return sum_left + sum_right;
	}
}
	
int  main(){
	
	int arr[100001]{0};
	int size,N; 
	int tree[MAX_LEN] = {0};
	queue<int> q;
	
	cin>>size;
	cin>>N;
	for(int i=0;i<size;i++){
		cin>>arr[i];
	}
	for(int i=1;i<=N;i++){
		int t;
		cin>>t;
	build_tree(arr,tree,0,0,size-1);
		if(t==2){
			int a,b; 
			cin>>a>>b;
			q.push(query_tree(arr ,tree,0,0, size-1 ,a-1,b-1)); 
		}else if(t==1){
			int a,b,c;
			cin>>a>>b>>c;
			for(int j=a-1;j<=b-1;j++)
			update_tree(arr , tree , 0 , 0 , size-1 , j , c);
		} 
		
	}
	for(;q.front();){
		cout<<q.front()<<endl;
		q.pop();
	}
	
	return 0;
}
2020/11/2 19:54
加载中...