为什么爆了
查看原帖
为什么爆了
466312
无奈之白楼主2022/2/24 17:28
#include<iostream>
#include <cstdio>
#define N 10005
using namespace std;
int n,m,in_put[N],cinn;
struct T{
	int l,r,sum,add;
}tree[4*N];

void build(int i,int l,int r){
	if(tree[i].l==tree[i].r){
		tree[i].sum=in_put[l];
		return ;
	}
	int mid=(tree[i].l+tree[i].r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
void add(int i){
	if(tree[i].add){
		tree[i*2].sum+=tree[i].add*(tree[i*2].r-tree[i*2].l+1);
		tree[i*2+1].sum+=tree[i].add*(tree[i*2+1].r-tree[i*2+1].r+1);
		tree[i*2].add+=tree[i].add;
		tree[i*2+1].add+=tree[i].add;
		tree[i].add=0;
	}
}
void jiafa(int i,int l,int r,int k){
	if(tree[i].l>=l&&tree[i].r<=r){
		tree[i].sum+=k*(tree[i].r-tree[i].l+1);
		tree[i].add+=k;
		return ;
	}
	add(i);
	int midd=(tree[i].l+tree[i].r)/2;
	if(midd>=l)jiafa(i*2,l,r,k);
	if(midd<r)jiafa(i*2+1,l,r,k);
	tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
int ask(int i,int l,int r){
	if(tree[i].l>=l&&tree[i].r<=r)return tree[i].sum;
	add(i);
	int mid=(tree[i].r+tree[i].l)/2;
	int ans=0;
	if(mid>=l)ans+=ask(i*2,l,r);
	if(mid<r)ans+=ask(i*2+1,l,r);
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>in_put[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>cinn;
		if(cinn==1){
			int ll,rr,kk;
			cin>>ll>>rr>>kk;
			jiafa(1,ll,rr,kk);
		}
		else{
			int lll,rrr;
			cin>>lll>>rrr;
			cout<<ask(1,lll,rrr);
		}
	}
	return 0;
}

为什么爆 了

2022/2/24 17:28
加载中...