线段树求调
  • 板块学术版
  • 楼主tzzwx
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/7/17 15:25
  • 上次更新2023/11/3 09:19:49
查看原帖
线段树求调
749673
tzzwx楼主2023/7/17 15:25
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 5;
int n, m, a[N];

struct SegmentTree
{
    int l, r, dat, lazy;
    #define l(x) t[x].l
    #define r(x) t[x].r
    #define dat(x) t[x].dat
    #define lazy(x) t[x].lazy
}t[4 * N];

void build(int p, int l, int r)
{
    l(p) = l, r(p) = r;
    if (l == r) {dat(p) = a[l]; return;}
    int mid = (l + r) / 2;
    build(p * 2, l, mid), build(p * 2 + 1, mid + 1, r);
    dat(p) = dat(p * 2) + dat(p * 2 + 1);
}

void update(int p, int l, int r, int d)
{
    if (l <= l(p) && r(p) <= r)
    {
        dat(p) += d * (r(p) - l(p) + 1), lazy(p) += d; 
        return;
    }
    if (lazy(p))
        dat(p * 2) += lazy(p) * (r(p * 2) - l(p * 2) + 1),
        dat(p * 2 + 1) += lazy(p) * (r(p * 2 + 1) - l(p * 2 + 1) + 1),
        lazy(p * 2) += lazy(p), lazy(p * 2 + 1) += lazy(p), lazy(p) = 0;
    int mid = (l + r) / 2;
    if (l <= mid) update(p * 2, l, mid, d);
    if (mid < r) update(p * 2 + 1, mid + 1, r, d);
    dat(p) = dat(p * 2) + dat(p * 2 + 1);
}

int query(int p, int l, int r)
{
    if (l <= l(p) && r(p) <= r) return dat(p);
    int mid = (l + r) / 2, cnt = 0;
    if (l <= mid) cnt += query(p * 2, l, mid);
    if (mid < r) cnt += query(p * 2 + 1, mid + 1, r);
    return cnt;
}

signed main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    build(1, 1, n);
    while (m--)
    {
        int op, x, y;
        cin >> op >> x >> y;
        if (op == 1)
        {
            int k; cin >> k;
            update(1, x, y, k);
        }
        else
            cout << query(1, x, y) << endl;
    }
    return 0;
}

运行时错误 函数query()第一行的if语句报错Segmentation fault

2023/7/17 15:25
加载中...