求助 3*TLE
查看原帖
求助 3*TLE
566549
thezmmm楼主2021/11/18 17:19
#include<stdio.h>
int arr[100000];
int tree[400000];
  
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;
		int right_node = 2*node+1;
		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;
		int right_node = 2*node+1;
		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];
	}
}
//	求arr中[L,R]的和
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];
	int mid = (start+end)/2;
	int left_node = 2*node;
	int right_node = 2*node+1;
	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 m,n;
    scanf("%d%d",&n,&m);
    for(int i = 0;i < n;i++){
        scanf("%d",&arr[i]);
    }
    build_tree(arr,tree,1,0,n-1);
    for(int i = 0;i < m ;i++){
        int ops;
        scanf("%d",&ops);
        if(ops == 1){
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            for(int idx = x-1;idx<=y-1;idx++)
                update_tree(arr,tree,1,0,n-1,idx,k);
        }
        else{
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%d\n",query_tree(arr,tree,1,0,n-1,x-1,y-1));
        }
    }
    return 0;
}
2021/11/18 17:19
加载中...