初学者的疑问
查看原帖
初学者的疑问
521283
wangif424楼主2022/8/27 23:50
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100001];
struct tree{
	int l,r;long long sum,lazy;
}t[500001];
int c,x,y,k;
void build(int l,int r,int i){
	t[i].l=l;
	t[i].r=r;
	if(l!=r){
		int mid=(l+r)>>1;
		build(l,mid,i*2);
		build(mid+1,r,i*2+1);		
		t[i].sum=t[2*i].sum+t[2*i+1].sum;
	}else{
		t[i].sum=a[l];
	}
	return;
}
void putdown(int i){
	t[2*i].sum+=(t[2*i].r-t[2*i].l+1)*t[i].lazy;
	t[2*i].lazy+=t[i].lazy;
	t[2*i+1].sum+=(t[2*i+1].r-t[2*i+1].l+1)*t[i].lazy;
	t[2*i+1].lazy+=t[i].lazy;
	t[i].lazy=0;
	return;
}
void add(int l,int r,int k,int i){	
//	cout << t[i].l << " " << t[i].r << " " << t[i].sum << endl;	
	if(l<=t[i].l && r>=t[i].r){
		t[i].lazy+=k;
		t[i].sum+=(t[i].r-t[i].l+1)*k;
		return;
	}
	putdown(i);
	int mid=(t[i].l+t[i].r)>>1;
	if(l<=mid) add(l,r,k,2*i);
    if(r>mid) add(l,r,k,2*i+1);
	t[i].sum=t[2*i].sum+t[2*i+1].sum;
//	cout << t[i].l << " " << t[i].r << " " << t[i].sum << endl;
	return;
}
long long find(int l,int r,int i){
	//cout << t[i].l << " " << t[i].r << " " << t[i].sum << endl;
	if(l<=t[i].l && r>=t[i].r) return t[i].sum;
	else if (t[i].r<l || t[i].l>r)return 0;
	putdown(i);
	int mid=(t[i].l+t[i].r)>>1;
    long long ans=0;
    if(l<=mid) ans+=find(l,r,i*2);
    if(r>mid) ans+=find(l,r,i*2+1);
	return ans;
}
signed main(){
	cin >> n >> m ;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}	
	build(1,n,1);
	while(m--){
		cin >> c;
		if(c==1){
			cin >> x >> y >> k;
			add(x,y,k,1);			
		}else{
			cin >> x >> y;
			cout << find(x,y,1) << endl;
		}
	}
	return 0;
}

为什么把所有的int都换成long long就会报错

2022/8/27 23:50
加载中...