线段树0pts求条
查看原帖
线段树0pts求条
1070982
Guoguo2013楼主2024/8/31 17:12
#include<bits/stdc++.h>
#define int long long
#define PII pair< int, int >
#define MII map< int, int >
#define MIB map< int, bool >
#define lson (rt << 1)
#define rson ((rt << 1) | 1)

using namespace std;

const int N = 5e5 + 5, mod = 998244353;
int n, m, a[N], s[N], lazy[N], zm;

void push_up(int rt){
	s[rt] = s[lson] + s[rson];
}
void build(int rt, int l, int r){
	lazy[rt] = 0;
	if (l == r){
		s[rt] = a[l];
		return ;
	}
	int mid = l + r >> 1ll;
	build(lson, l, mid);
	build(rson, mid + 1, r);
	push_up(rt);
//	printf("%lld %lld\n", rt, s[rt]);
}
void f(int rt, int l, int r, int k){
	lazy[rt] += k;
	s[rt] += (r - l + 1) * k;
}
void push_down(int rt, int l, int r){
	int mid = l + r >> 1ll;
	f(lson, l, mid, lazy[rt]);
	f(rson, mid + 1, r, lazy[rt]);
	lazy[rt] = 0;
}
void update(int rt, int l, int r, int nl, int nr, int k){
	if (r < nl || l > nr) return ;
	if (nl <= l && r <= nr){
		f(rt, l, r, k);
		return ;
	}
	push_down(rt, l, r);
	int mid = l + r >> 1ll;
	update(lson, l, mid, nl, nr, k);
	update(rson, mid + 1, r, nl, nr, k);
	push_up(rt);
}
int query(int rt, int l, int r, int ql, int qr){
	if (r < ql || l > qr) return 0;
	if (ql <= l && r <= qr) return s[rt];
	int mid = l + r >> 1ll;
	push_down(rt, l, r);
	return query(lson, l, mid, ql, qr) + query(rson, mid + 1, r, ql, qr);
}
template<typename T>inline void read(T &x){bool f=1;x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=!f;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x=(f?x:-x);return;}
int ksm(int a, int b, int p){int ans = 1;while(b){if(b & 1)ans =(ans*a)%p;b >>= 1;a = (a*a) % p;}return ans;}
signed main(){
//	freopen("a.in", "r", stdin);
//	freopen("a.out","w",stdout);
	read(n);
	read(m);
	read(zm);
	for (int i = 1; i <= n - 1; i++) read(a[i]);
	build(1, 1, n - 1);
	for (int i = 1; i <= m; i++){
		int op;
        read(op);
        if (op == 1){
        	int l, r, k;
        	read(l);
        	read(r);
        	read(k);
        	if (l == 1){
				zm += k;
				l++;
			}
            update(1, 1, n, l - 1, r - 1, k);
        }
        else if (op == 2){
			int k;
			read(k);
			zm += k;
		}
		else if (op == 3){
			int k;
			read(k);
			zm -= k;
		}
        else if (op == 4){
        	int l, r;
            read(l);
            read(r);
            if (l == 1) printf("%lld\n", zm + query(1, 1, n, l, r - 1));
            else printf("%lld\n", query(1, 1, n, l - 1, r - 1));
        }
        else printf("%lld\n", zm);
    }
	return 0;
}

样例明明过了啊?

2024/8/31 17:12
加载中...