啊啊啊不知道错在哪里!!求助!!
查看原帖
啊啊啊不知道错在哪里!!求助!!
143742
Nelson_Wang楼主2021/9/24 21:36
//查分一次不够就再差分一次
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;

int n, m, s[N];
int t[N*4], laz[N*4];

#define ls x<<1
#define rs x<<1|1
void spread(int x, int l, int r){
	int mid = (l+r)>>1;
	t[ls] += laz[x]*(mid-l+1);
	t[rs] += laz[x]*(r-mid);
	laz[ls] += laz[x];
	laz[rs] += laz[x];
	laz[x] = 0;
}
void modify(int x, int l, int r, int ql, int qr, int v){
	if(ql<=l && r<=qr){
		t[x] += v*(r-l+1);
		laz[x] += v;
		return;
	}
	if(laz[x])
		spread(x, l, r);
	int mid = (l+r)>>1;
	if(ql<=mid)
		modify(ls, l, mid, ql, qr, v);
	if(qr>mid)
		modify(rs, mid+1, r, ql, qr, v);
	t[x] = t[ls]+t[rs];
}
int query(int x, int l, int r, int ql, int qr){
	if(ql<=l && r<=qr)
		return t[x];
	if(laz[x])
		spread(x, l, r);
	int mid = (l+r)>>1, sum = 0;
	if(ql<=mid)
		sum += query(ls, l, mid, ql, qr);
	if(qr>mid)
		sum += query(rs, mid+1, r, ql, qr);
	return sum;
}
int main(){
	freopen("P1438_1.in", "r", stdin);
	scanf("%d%d", &n, &m);
	for(int i=1; i<=n; ++i)
		scanf("%d", s+i);
	while(m--){
		int x, p, l, r, K, D;
		scanf("%d", &x);
		if(x==1){
			scanf("%d%d%d%d", &l, &r, &K, &D);
			modify(1, 1, n, l, l, K);
			if(l!=r)
				modify(1, 1, n, l+1, r, D);
		}
		else{
			scanf("%d", &p);
			printf("%d\n", query(1, 1, n, 1, p)+s[p]);
		}
	}
	return 0;
}
2021/9/24 21:36
加载中...