70分求调,#8,#9,#10,wa
查看原帖
70分求调,#8,#9,#10,wa
1112575
with_my_moon楼主2024/8/20 18:03
#include <iostream>
#include <math.h>
#include <algorithm>
#include <cstdio>
using namespace std;

#define maxn 1000005
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1

int n,m;
int val,nowl,nowr;
int a[16*maxn];
long long sum[16*maxn],col[16*maxn];

void update(int rt){
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

void build(int l,int r,int rt){
	if(l==r){
		sum[rt]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(lson);
	build(rson);
	update(rt);
}

void color(int l,int r,int rt,int c){
	sum[rt]+=c*(r-l+1);
	col[rt]+=c;
}

void push_col(int l,int r,int rt){
	if(col[rt]){
		int mid=(r+l)>>1;
		color(lson,col[rt]);
		color(rson,col[rt]);
		col[rt]=0;
	}
}

int query(int l,int r,int rt){
	if(nowl<=l&&r<=nowr) return sum[rt];
	push_col(l,r,rt);
	int mid=(r+l)>>1,ans=0;
	if(nowl<=mid) ans+=query(lson);
	if(mid+1<=nowr) ans+=query(rson);
	return ans;
}

void modify(int l,int r,int rt,int c){
	if(nowl<=l&&r<=nowr){color(l,r,rt,c);return;}
	push_col(l,r,rt);
	int mid=(r+l)>>1;
	if(nowl<=mid) modify(lson,c);
	if(mid+1<=nowr) modify(rson,c);
	update(rt);
}


int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	build(1,n,1);
	for(int i=1;i<=m;++i){
		int op;
		scanf("%d %d %d",&op,&nowl,&nowr);
		if(op==1){
			scanf("%d",&val);
			modify(1,n,1,val);
		}
		else{
			printf("%d\n",query(1,n,1));
		}
	}
}
2024/8/20 18:03
加载中...