线段树4

#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 size;
	int x,y;
	node(){sum=size=x=y=0;}
	void init(int v){sum=v;size=1;}
}z[maxn<<2];
node operator+(const node&l,const node&r){
	node res;
	res.sum=l.sum+r.sum;
	res.size=l.size+r.size;
	return res;
}
void color(int l,int r,int rt,int x,int y){
	z[rt].x+=x;
	z[rt].y+=y;
	z[rt].sum+=(x+x+(z[rt].size-1)*y)*z[rt].size/2;
}
void push_col(int l,int r,int rt){
	if(z[rt].x==0&&z[rt].y==0)return;
	int m=(l+r)>>1;
	color(lson,z[rt].x,z[rt].y);
	color(rson,z[rt].x+z[rt<<1].size*z[rt].y,z[rt].y);
	z[rt].x=z[rt].y=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 x,int y){
	if(nowl<=l&&r<=nowr){
		color(l,r,rt,x,y);
		return;
	}
	push_col(l,r,rt);
	int m=(l+r)>>1;
	if(nowl<=m)modify(lson,nowl,nowr,x,y);
	if(m<nowr)modify(rson,nowl,nowr,x,y);
	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,x,y;
			cin>>l>>r>>x>>y;
			modify(root,l,r,x,y);
		}
	}
	return 0;
}    
posted @ 2025-06-21 20:40  Fire_poetry  阅读(7)  评论(0)    收藏  举报