- 玄关求调
tiao
- @ 2025-8-27 15:57:45
#define lc (p << 1)
#define rc (p << 1 | 1)
#define mid ((l + r) >> 1)
using namespace std;
const int N = 1000005;
int a[N];
int sum[N << 2];
int tag[N << 2];
void up(int p) {
sum[p] = sum[lc] + sum[rc];
}
void down(int l, int r, int p){
if(!tag[p] || l == r) {
return ;
}
sum[lc] += tag[p] * (mid - l + 1);
sum[rc] += tag[p] * (r - mid);
tag[lc] += tag[p];
tag[rc] += tag[p];
tag[p] = 0;
}
void build (int l, int r, int p) {
if (l == r) {
sum[p] = a[l];
return ;
}
build(l, mid, lc);
build(mid + 1, r, rc);
up(p);
}
int query (int ql, int qr, int l, int r, int p){
if (ql <= l && r <= qr) {
return sum[p];
}
down(l,r,p);
int res = 0 ;
if(ql <= mid){
res += query(ql, qr, l, mid, lc);
}
if(qr > mid){
res += query(ql, qr, mid + 1, r, rc);
}
return res;
}
void update (int ql, int qr, int l, int r, int p, int v){
if(ql <= l && r <= qr){
sum[p] += v * (r-l+1);
tag[p] += v;
return ;
}
down(l,r,p);
if(ql <= mid) {
update(ql,qr,l,mid,lc,v);
}
if(qr > mid) {
update(ql,qr,mid + 1,r,rc,v);
}
up(p);
}
int main(){
int n;
cin>>n;
for(int i = 1; i <= n; i++) {
cin>>a[i];
}
int m;
cin>>m;
for(int i = 1, op, l, r, x; i <= m; i++) {
cin>>op;
if(op == 1){
cin>>l>>r>>x;
update(l, r, 1, n, 1, x);
}
else{
cin>>l>>r;
cout<<query(l,r,1,n,1)<<endl;
}
}
}```
1 条评论
-
-
#include <bits/stdc++.h> #define lc (p << 1) #define rc (p << 1 | 1) #define mid ((l + r) >> 1) #define int long long // using namespace std; const int N = 1000005; int a[N]; int sum[N << 2]; int tag[N << 2]; void up(int p) { sum[p] = sum[lc] + sum[rc]; }
void down(int l, int r, int p){ if(!tag[p] || l == r) { return ; } sum[lc] += tag[p] * (mid - l + 1); sum[rc] += tag[p] * (r - mid); tag[lc] += tag[p]; tag[rc] += tag[p]; tag[p] = 0; } void build (int l, int r, int p) { if (l == r) { sum[p] = a[l]; return ; } build(l, mid, lc); build(mid + 1, r, rc); up(p); }
int query (int ql, int qr, int l, int r, int p){ if (ql <= l && r <= qr) { return sum[p]; } down(l,r,p); int res = 0 ; if(ql <= mid){ res += query(ql, qr, l, mid, lc); } if(qr > mid){ res += query(ql, qr, mid + 1, r, rc); } return res; }
void update (int ql, int qr, int l, int r, int p, int v){ if(ql <= l && r <= qr){ sum[p] += v * (r-l+1); tag[p] += v; return ; } down(l,r,p); if(ql <= mid) { update(ql,qr,l,mid,lc,v); } if(qr > mid) { update(ql,qr,mid + 1,r,rc,v); } up(p); }
signed main(){ int n; cin>>n; for(int i = 1; i <= n; i++) { cin>>a[i]; } build(1,n,1);// int m; cin>>m; for(int i = 1, op, l, r, x; i <= m; i++) { cin>>op; if(op == 1){ cin>>l>>r>>x; update(l, r, 1, n, 1, x); } else{ cin>>l>>r; cout<<query(l,r,1,n,1)<<endl; } } } //4
- 1