线段树模板

2019-10-04  本文已影响0人  DaiMorph

https://www.cnblogs.com/xenny/p/9801703.html

#include<iostream>
using namespace std;
const int maxn = 1e4 + 10;
int a[maxn], t[maxn << 2], lazy[maxn << 2];
void build(int root, int l, int r)
{
    if (l == r)
    {
        t[root] = a[l];
        return;
    }
    int m = (l + r) / 2;
    build(root * 2, l, m);
    build(root * 2 + 1, m + 1, r);
    t[root] = t[root * 2] + t[root * 2 + 1];
}
void update(int p, int val, int l, int r, int root)
{
    if (l == r)
    {
        t[l] += val;
        return;
    }
    int m = (l + r) / 2;
    if (p < m)update(p, val, l, m, root);
    else if (p > m)update(p, val, m + 1, r, root);
    t[root] = t[root * 2] + t[root * 2 + 1];
}
int query(int L, int R, int l, int r, int root)
{
    if (L <= l && r <= R)
    {
        return t[root];
    }
    int res = 0;
    int mid = (l + r) / 2;
    if (L < mid)res += query(L, R, l, mid, root * 2);
    if (R > mid)res += query(L, R, mid + 1, r, root * 2 + 1);
    return res;
}

void pushdown(int root)
{
    if (lazy[root])
    {
        lazy[root * 2] += lazy[root];
        lazy[root * 2 + 1] += lazy[root];
        t[root * 2] += lazy[root * 2];
        t[root * 2 + 1] += lazy[root * 2 + 1];
        lazy[root] = 0;
    }
}
void updatelazy(int L,int R,int val,int l,int r,int root){
    if (L <= l && r <= R) {
        lazy[root] += val;
        return;
    }
    pushdown(root);
    int mid = (l + r) / 2;
    if (L <= mid)update(L, R, val, l, mid, root * 2);
    if (R > mid)update(L, R, val, mid + 1, R, root * 2 + 1);
    t[root] = t[root * 2] + t[root * 2 + 1];
}
int querylazy(int L, int R, int l, int r, int root)
{
    if (L <= l && r <= R)
    {
        return t[root];
    }
    pushdown(root);
    int res = 0;
    int mid = (l + r) / 2;
    if (L <= mid)res += querylazy(L, R, l, mid, root * 2);
    if (R > mid)res += querylazy(L, R, mid + 1, r, root * 2 + 1);
    return res;
}

上一篇下一篇

猜你喜欢

热点阅读