TLE求调
查看原帖
TLE求调
1466339
yu10001909楼主2025/8/30 11:34
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 201000;

ll n, m, a[N];

struct LineTree {
    ll sum;
} seg[N * 4];

inline void update(int id) {
    seg[id].sum = seg[id * 2].sum + seg[id * 2 + 1].sum;
}

inline void build(int id, int l, int r) {
    if (l == r) seg[id].sum = a[l];
    else {
        int mid = (l + r) / 2;
        build(id * 2, l, mid);
        build(id * 2 + 1, mid + 1, r);
        update(id);
    }
}

inline void add(int id, int l, int r, int lpos, int rpos, ll k) {
    if (l == r) seg[id].sum += k;
    else {
        int mid = (l + r) / 2;
        if (rpos <= mid) add(id * 2, l, mid, lpos, rpos, k);
        else if (lpos > mid) add(id * 2 + 1, mid + 1, r, lpos, rpos, k);
        else {
            add(id * 2, l, mid, lpos, mid, k);
            add(id * 2 + 1, mid + 1, r, mid + 1, rpos, k);
        }
        update(id);
    }
}

inline ll query(int id, int l, int r, int ql, int qr) {
    if (l == ql && r == qr) return seg[id].sum;
    else {
        int mid = (l + r) / 2;
        if (qr <= mid) return query(id * 2, l, mid, ql, qr);
        else if (ql > mid) return query(id * 2 + 1, mid + 1, r, ql, qr);
        else {
            return query(id * 2, l, mid, ql, mid) + query(id * 2 + 1, mid + 1, r, mid + 1, qr);
        }
        update(id);
    }
}

int main() {
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &a[i]);
    build(1, 1, n);
    for (int i = 1; i <= m; i++) {
        int opt, x, y;
        ll k;
        scanf("%d%d%d", &opt, &x, &y);
        if (opt == 1) {
            scanf("%lld", &k);
            add(1, 1, n, x, y, k);
        } else {
            printf("%lld\n", query(1, 1, n, x, y));
        }
    }
}

(抄老师的板子)

https://www.luogu.com.cn/record/233806567

2025/8/30 11:34
加载中...