加上关闭同步就会出问题
查看原帖
加上关闭同步就会出问题
164840
zhaowangji楼主2020/12/25 19:47
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct SegementTree{
	int l,r;
	long long sum;
	int p;
}t[400007];
long long a[100007];
void pushup(int id){
	t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
	return;
}
void pushdown(int id){
	if(t[id].p){
		t[id<<1].p+=t[id].p;
		t[id<<1].sum+=t[id].p*(t[id<<1].r-t[id<<1].l+1);
		t[id<<1|1].p+=t[id].p;
		t[id<<1|1].sum+=t[id].p*(t[id<<1|1].r-t[id<<1|1].l+1);
		t[id].p=0;
	}
	return;
}
void build(int id,int l,int r){
	t[id].l=l;t[id].r=r;
	if(l==r){t[id].sum=a[l];return;}
	int mid=(l+r)>>1;
	build(id<<1,l,mid);build(id<<1|1,mid+1,r);
	pushup(id);
	return;
}
void add(int id,int l,int r,int k){
	if(l<=t[id].l&&t[id].r<=r){
		t[id].sum+=k*(t[id].r-t[id].l+1);
		t[id].p+=k;
		return;
	}
	pushdown(id);
	int mid=(t[id].l+t[id].r)>>1;
	if(l<=mid)add(id<<1,l,r,k);
	if(r>mid)add(id<<1|1,l,r,k);
	pushup(id);
	return;
}
long long get_sum(int id,int l,int r){
	if(l<=t[id].l&&t[id].r<=r)
		return t[id].sum;
	pushdown(id);
	int mid=(t[id].l+t[id].r)>>1;
	if(r<=mid)return get_sum(id<<1,l,r);
	else if (l>mid)return get_sum(id<<1|1,l,r);
	else return get_sum(id<<1,l,r)+get_sum(id<<1|1,l,r);
}
int Read();
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	n=Read();m=Read();
	for(int i=1;i<=n;++i)
		a[i]=Read();
	build(1,1,n);
	for(int i=1;i<=m;++i){
		int f;cin>>f;
		if(f==1){
			int x=Read(),y=Read(),k=Read(); 
			add(1,x,y,k);
		}
		else {
			int x=Read(),y=Read();
			cout<<get_sum(1,x,y)<<"\n";
		}
	}
	return 0;
}
int Read(){
	char ch=getchar();
	int res=0,flag=1;
	while(ch<'0'||ch>'9'){
		ch=='-'?flag=-1:ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		res=(res<<3)+(res<<1)+ch-'0';
		ch=getchar();
	}
	return flag*res;
}

如题,如果去掉 ios 那几行,就行了,如果不删,运行都会出问题。求助

2020/12/25 19:47
加载中...