线段树3

#include<bits/stdc++.h>
using namespace std;
#define root 1,n,1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=100010;
int n,m,a[maxn];
struct node{
	int sum;
	int sum2;
	int size;
	int add;
	node(){sum=size=add=0;}
	void init(int v){sum=v;sum2=v*v;size=1;}
}z[maxn<<2];
node operator+(const node&l,const node&r){
	node res;
	res.sum2=l.sum2+r.sum2;
	res.sum=l.sum+r.sum;
	res.size=l.size+r.size;
	return res;
}
void color(int l,int r,int rt,int v){
	z[rt].add+=v;
	z[rt].sum2=z[rt].sum2+2*v*z[rt].sum+z[rt].size*v*v;
	z[rt].sum+=z[rt].size*v;
}
void push_col(int l,int r,int rt){
	if(z[rt].add==0)return;
	int m=(l+r)>>1;
	color(lson,z[rt].add);
	color(rson,z[rt].add);
	z[rt].add=0;
}
void build(int l,int r,int rt){
	if(l==r){
		z[rt].init(a[l]);
		return;
	}
	int m=(l+r)>>1;
	build(lson);
	build(rson);
	z[rt]=z[rt<<1]+z[rt<<1|1];
}
node query(int l,int r,int rt,int nowl,int nowr){
	if(nowl<=l&&r<=nowr)return z[rt];
	push_col(l,r,rt);
	int m=(l+r)>>1;
	if(nowl<=m){
		if(m<nowr)return query(lson,nowl,nowr)+query(rson,nowl,nowr);
		else return query(lson,nowl,nowr);
	}
	else return query(rson,nowl,nowr);
}
void modify(int l,int r,int rt,int nowl,int nowr,int v){
	if(nowl<=l&&r<=nowr){
		color(l,r,rt,v);
		return;
	}
	push_col(l,r,rt);
	int m=(l+r)>>1;
	if(nowl<=m)modify(lson,nowl,nowr,v);
	if(m<nowr)modify(rson,nowl,nowr,v);
	z[rt]=z[rt<<1]+z[rt<<1|1];
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(root);
	cin>>m;
	for(int i=1;i<=m;i++){
		int opt;
		cin>>opt;
		if(opt==1){
			int l,r;
			cin>>l>>r;
			cout<<query(root,l,r).sum<<"\n";
		}
		else{
			int l,r,v;
			cin>>l>>r>>v;
			modify(root,l,r,v);
		}
	}
	return 0;
}
posted @ 2025-06-21 20:40  Fire_poetry  阅读(14)  评论(0)    收藏  举报