比赛 2025.3.6 评测结果 AAAAAAAAAA
题目名称 WHZ 的序列 最终得分 100
用户昵称 darkMoon 运行时间 1.488 s
代码语言 C++ 内存使用 11.84 MiB
提交时间 2025-03-06 19:10:00
显示代码纯文本
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define int long long
using namespace std;
auto IN = freopen("whz_sequence.in", "r", stdin);
auto OUT = freopen("whz_sequence.out", "w", stdout);
auto IOS = ios::sync_with_stdio(false);
auto CIN = cin.tie(nullptr);
int mread(){
    int x = 0, f = 1;
    char c = cin.get();
    while(c < '0' || c > '9'){
        if(c == '-'){
            f = -1;
        }
        c = cin.get();
    }
    while(c >= '0' && c <= '9'){
        x = x * 10 + c - '0';
        c = cin.get();
    }
    return x * f;
}
const int N = 2e5 + 5;
int a[N];
struct tree{
    int s[N << 2], la[N << 2], len[N << 2];
    void pushup(int x){
        s[x] = s[x << 1];
        if(len[x << 1] & 1){
            s[x] -= s[x << 1 | 1];
        }
        else{
            s[x] += s[x << 1 | 1];
        }
        return;
    }
    void update(int x, int k){
        la[x] += k;
        if(len[x] & 1){
            s[x] += k;
        }
        return;
    }
    void pushdown(int x){
        if(la[x]){
            update(x << 1, la[x]);
            update(x << 1 | 1, la[x]);
            la[x] = 0;
        }
        return;
    }
    void build(int x, int nl, int nr){
        len[x] = nr - nl + 1;
        s[x] = la[x] = 0;
        if(nl == nr){
            s[x] = a[nl];
            return;
        }
        int mid = nl + nr >> 1;
        build(x << 1, nl, mid);
        build(x << 1 | 1, mid + 1, nr);
        pushup(x);
        return;
    }
    void add(int x, int nl, int nr, int l, int r, int k){
        if(nl >= l && nr <= r){
            update(x, k);
            return;
        }
        int mid = nl + nr >> 1;
        pushdown(x);
        if(l <= mid){
            add(x << 1, nl, mid, l, r, k);
        }
        if(mid + 1 <= r){
            add(x << 1 | 1, mid + 1, nr, l, r, k);
        }
        pushup(x);
        return;
    }
    pair<int, int> query(int x, int nl, int nr, int l, int r){
        if(nl >= l && nr <= r){
            return mp(s[x], len[x]);
        }
        pushdown(x);
        int mid = nl + nr >> 1, ans = 0, len = 0;
        if(l <= mid){
            auto tmp = query(x << 1, nl, mid, l, r);
            ans = tmp.fi, len = tmp.se;
        }
        if(mid + 1 <= r){
            auto tmp = query(x << 1 | 1, mid + 1, nr, l, r);
            if(len & 1){
                ans -= tmp.fi;
            }
            else{
                ans += tmp.fi;
            }
            len += tmp.se;
        }
        return mp(ans, len);
    }
}tr;
int n = mread();
signed main(){
    for(int i = 1; i <= n; i ++){
        a[i] = mread();
    }
    tr.build(1, 1, n);
    int q = mread();
    while(q --){
        int op = mread();
        if(op == 1){
            int l = mread(), r = mread(), k = mread();
            tr.add(1, 1, n, l, r, k);
        }
        else{
            int l = mread(), r = mread();
            cout << tr.query(1, 1, n, l, r).fi << "\n";
        }
    }
    return 0;
}