线段树求调(RE)
  • 板块学术版
  • 楼主周一章
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/11/22 17:36
  • 上次更新2024/11/22 19:48:17
查看原帖
线段树求调(RE)
384730
周一章楼主2024/11/22 17:36
#include<bits/stdc++.h>
#define LL long long
using namespace std;

template<class T>inline void read(T &n){
	n=0;LL k=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')k=-k;c=getchar();}
	while(isdigit(c))n=n*10+c-'0',c=getchar();
	n*=k;
}
template<class T>inline void write(T n){
	if(n<0)putchar('-'),n=-n;
	if(n>9)write(n/10);
	putchar(n%10+'0');
}

const LL MaxN=1e5+5;
LL n,m,a[MaxN];
LL opt,x,y,k;

struct node{
	LL l,r;
	LL sum,add;
};node t[MaxN<<2+2];

inline void build(LL p,LL l,LL r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].sum=a[l];
		return ; 
	}
	LL mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
inline void spread(LL p){
	if(t[p].add){
		t[p<<1].sum+=t[p].add*(t[p<<1].r-t[p<<1].l+1);
		t[p<<1|1].sum+=t[p].add*(t[p<<1|1].r-t[p<<1|1].l+1);
		t[p<<1].add+=t[p].add;
		t[p<<1|1].add+=t[p].add;
		t[p].add=0;
	}

}
inline void change(LL p,LL l,LL r,LL k){
	if(l<=t[p].l&&r>=t[p].r){
		t[p].sum+=k*(t[p].r-t[p].l+1);
		t[p].add+=k;
		return ;
	}
	spread(p);
	LL mid=(l+r)>>1;
	if(l<=mid)change(p<<1,l,r,k);
	if(r>mid)change(p<<1|1,l,r,k);
	t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
inline LL ask(LL p,LL l,LL r){
	if(l<=t[p].l&&r>=t[p].r)return t[p].sum;
	spread(p);
	LL mid=(t[p].l+t[p].r)>>1;
	LL ans=0;
	if(l<=mid)ans+=ask(p<<1,l,r);
	if(r>mid)ans+=ask(p<<1|1,l,r);
	return ans;
}

int main(){
	read(n),read(m);
	for(LL i=1;i<=n;i++){
		read(a[i]);
	}
	build(1,1,n);
	for(LL i=1;i<=m;i++){
		read(opt),read(x),read(y);
		if(opt==1){
			read(k);
			change(1,x,y,k);
		}else{
			write(ask(1,x,y));
			putchar('\n');
		}
	}
	return 0;
}
2024/11/22 17:36
加载中...