怎麼這麼多蟲!

該比賽已結束,您無法在比賽模式下遞交該題目。您可以點選“在題庫中開啟”以普通模式檢視和遞交本題。

Problem Description

Author: louishuang

有人想要耍毒寫了一顆線段樹結果寫爛了

再幫他除蟲一次吧!

修改 6\le 6 個字元且 AC: 100 分。

修改 25\le 25 個字元且 AC: 50 分。

否則:0 分。

#include <iostream>
#include <vector>

using namespace std;

#define int long long

const int MAXN = 200005;
int tree[MAXN * 4], lazy[MAXN * 4];

void push_down(int node, int l, int r) {
    if (lazy[node] != 0) {
        int mid = (l + r) / 2;
        tree[node * 2] += lazy[node] * (mid - l + 1);
        tree[node * 2 + 1] += lazy[node] * (r - mid);
        lazy[node * 2] += lazy[node];
        lazy[node * 2 + 1] += lazy[node];
        lazy[node] = 0;
    }
}

void update(int node, int l, int r, int ql, int qr, int val) {
    if (ql <= l && r <= qr) {
        tree[node] += val * (r - l + 1);
        lazy[node] += val;
        return;
    }
    push_down(node, l, r);
    int mid = (l + r) / 2;
    if (ql <= mid) update(node * 2, l, mid, ql, qr, val);
    if (qr > mid) update(node * 2 + 1, mid + 1, r, ql, qr, val);
    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

int query(int node, int l, int r, int ql, int qr) {
    if (ql <= l && r <= qr) return tree[node];
    push_down(node, l, r);
    int mid = (l + r) / 2;
    int res = 0;
    if (ql <= mid) res += query(node * 2, l, mid, ql, qr);
    if (qr > mid) res += query(node * 2 + 1, mid + 1, r, ql, qr);
    return res;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n, q;
    if (!(cin >> n >> q)) return 0;
    while (q--) {
        int type, l, r;
        cin >> type >> l >> r;
        if (type == 1) {
            int val;
            cin >> val;
            update(1, 1, n, l, r, val);
        } else {
            cout << query(1, 1, n, l, r) << "\n";
        }
    }
    return 0;
}

5 3
1 1 5 2
1 2 4 3
2 1 5
19

第14屆程設班歡樂賽——幻月遊戲

未參加
狀態
已結束
規則
IOI
題目
23
開始於
2026-4-23 17:15
結束於
2026-4-23 20:15
持續時間
3 小時
主持人
參賽人數
24