求助,线段树,一直死循环
查看原帖
求助,线段树,一直死循环
191956
珂朵莉!楼主2021/2/21 21:11

rt,应该是add函数出错了,但一直都找不出来,老师也找不出来

#include<bits/stdc++.h>
using namespace std;
#define lid (id<<1)
#define rid (id<<1|1)
struct tree{
	int l,r,s,lz=0;
}t[40005];
int a[10005],n;
void pd(int id){
	if(t[id].lz&&t[id].l!=t[id].r){
		t[lid].lz+=t[id].lz;
		t[rid].lz+=t[id].lz;
		t[lid].s+=t[id].lz*(t[lid].r-t[lid].l+1);
		t[rid].s+=t[id].lz*(t[rid].r-t[rid].l+1);
		t[id].lz=0;
	}
}
void bt(int id,int l,int r){
	t[id].l=l;t[id].r=r;
	if(l==r){
		t[id].s=a[l];return;
	}
	int mid=(l+r)/2;
	bt(lid,l,mid);
	bt(rid,mid+1,r);
	t[id].s=t[lid].s+t[rid].s;
}
void add(int id,int l,int r,int val){
	pd(id);
	if(t[id].l==l&&t[id].r==r){
		t[id].lz+=val;
		t[id].s+=val*(t[id].r-t[id].l+1);
		return;
	}
	int mid=(l+r)/2;
	if(r<=mid)add(lid,l,r,val);
	else if(l>mid)add(rid,l,r,val);
	else add(lid,l,mid,val),add(rid,mid+1,r,val);
	t[id].s=t[lid].s+t[rid].s;
}
int get(int id,int l,int r){
	pd(id);
	if(t[id].l==l&&t[id].r==r)return t[id].s;
	int mid=(t[id].l+t[id].r)/2;
	if(mid>=r)return get(lid,l,r);
	if(l>mid)return get(rid,l,r);
	return get(lid,l,mid)+get(rid,mid+1,r);
}
int main(){
	int q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	bt(1,1,n);
	for(int i=1;i<=q;i++){
		int tp,x,y,z;
		cin>>tp;
		if(tp==1){
			cin>>x>>y>>z;
			add(1,x,y,z);
		}
		else{
			cin>>x>>y;
			cout<<get(1,x,y)<<endl;
		}
	}
}
2021/2/21 21:11
加载中...