性!感!代!码!在!线!求!调!
查看原帖
性!感!代!码!在!线!求!调!
575755
nopic楼主2023/3/14 19:04
#include<bits/stdc++.h>
using namespace std;

int n,m;
int input[20000010];
int ans;

struct node {
	int l,r;
	int sum,maxx;
	int add;
} tree[20000010];

void build(int now,int l,int r) {
	tree[now].l=l;
	tree[now].r=r;
	if(l==r) {
		tree[now].add=input[l];
		tree[now].sum=input[l];
		return;
	}
	int mid=(l+r)>>1;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
}
void pushup(int now) {
	tree[now].sum=tree[now<<1].sum+tree[now<<1 | 1].sum;
}
void solve_node(int now,int v) {
	tree[now].add+=v;
	tree[now].sum+=v*(tree[now].r-tree[now].l+1);
}
void pushdown(int now) {
	if(tree[now].add==0)
		return;
	solve_node(now<<1,tree[now].add);
	solve_node(now<<1 | 1,tree[now].add);
	tree[now].add=0;
}
void modify(int now,int x,int y,int v) {
	if(x<=tree[now].l&&y>=tree[now].r) {
		solve_node(now,v);
		return;
	}
	int mid=(tree[now].r+tree[now].l)>>1;
	pushdown(now);
	if(x<=mid)
		modify(now<<1,x,y,v);
	if(y>mid)
		modify(now<<1 | 1,x,y,v);
	pushup(now);
}

int query(int now,int x,int y) {
	if(x<=tree[now].l&&y>=tree[now].r)
		return tree[now].sum;
	int mid=(tree[now].l+tree[now].r)>>1,s=0;
	pushdown(now);
	if(x<=mid)
		s+=query(now<<1,x,y);
	if(y>mid)
		s+=query(now<<1 | 1,x,y);
	return s;

}

int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++)
		cin>>input[i];
	build(1,1,n);
	for(int i=1; i<=m; i++) {
		int a,x,y,k;
		cin>>a;
		if(a==1) {
			cin>>x>>y>>k;
			modify(1,x,y,k);
		} else {
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}

样例全过!! 蒟蒻求教了

2023/3/14 19:04
加载中...