线段树求调,实在看不出哪错了
查看原帖
线段树求调,实在看不出哪错了
180246
484A51楼主2021/8/22 11:12
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int n,m,tree[N*4],lazy[N*4];
#define ls k<<1
#define rs k<<1|1
int read();
void write(int);
void pushdown(int k,int l,int r){
	if(!lazy[k]) return;
	int mid=(l+r)>>1; 
	lazy[ls]+=lazy[k];
	lazy[rs]+=lazy[k];
	tree[ls]+=(mid-l+1)*lazy[k];
	tree[rs]+=(r-mid)*lazy[k];
	lazy[k]=0;
} //下传 
void build(int k,int l,int r){
	if(l==r){
		tree[k]=read();
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	tree[k]=tree[ls]+tree[rs];
} //建树 
int query(int k,int l,int r,int x,int y){
	if(x>r||y<l) return 0;
	if(x<=l&&y>=r) return tree[k];
	pushdown(k,l,r);
	int mid=(l+r)>>1;
	return query(ls,l,mid,x,y)+query(rs,mid+1,r,x,y);
} //查询 
void update(int k,int l,int r,int x,int y,int v){
	if(x>r||y<l) return;
	if(x<=l&&y>=r){
		tree[k]+=(r-l+1)*v;
		lazy[k]+=v;
		return;
	}
	pushdown(k,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) update(ls,l,mid,x,y,v);
	if(x>mid) update(rs,mid+1,r,x,y,v);
	tree[k]=tree[ls]+tree[rs];
} //区间修改 
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	n=read(); m=read();
	build(1,1,n);
	while(m--){
		int op=read(),x=read(),y,v;
		if(op==1){
			y=read();
			v=read();
			update(1,1,n,x,y,v);
		}
		else{
			y=read();
			write(query(1,1,n,x,y));
			puts("");
		}
	}
	return 0;
}
int read(){
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
void write(int x){
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
2021/8/22 11:12
加载中...