线段树(模版)

#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int maxn = 1e5 + 5;
struct ac{
    int l, r, w, lazy;
}tree[maxn >> 2];
int x, y, w, v, ans;
void build(int k, int ll, int rr) {
    tree[k].l = ll; tree[k].r = rr;
    if(ll == rr) {
        scanf("%d", &tree[k].w);
        return ;
    }
    int mm = (ll + rr) >> 1;
    build(k << 1, ll, mm);
    build(k << 1 | 1, mm + 1, rr);
    tree[k].w = tree[k << 1].w + tree[k << 1 | 1].w;
}
void down(int k) {
    tree[k << 1].lazy += tree[k].lazy;
    tree[k << 1 | 1].lazy += tree[k].lazy;
    tree[k << 1].w += tree[k].lazy * (tree[k << 1].r - tree[k << 1].l + 1);
    tree[k << 1 | 1].w += tree[k].lazy * (tree[k << 1 | 1].r - tree[k << 1 | 1].l + 1);
    tree[k].lazy = 0;
}
void change_point(int k) {
    if(tree[k].l == tree[k].r) {
        tree[k].w += v;
        return ;
    }
    if(tree[k].lazy) down(k);
    int mm = (tree[k].l + tree[k].r) >> 1;
    if(w < mm) change_point(k << 1);
    else change_point(k << 1 | 1);
    tree[k].w = tree[k << 1].w + tree[k << 1 | 1].w;
}
void change_interval(int k) { // x  l r  y
    if(tree[k].l >= x && tree[k].r <= y) {
        tree[k].w = v * (tree[k].r - tree[k].l + 1);
        tree[k].lazy += v;
        return ;
    }
    if(tree[k].lazy) down(k);
    int mm = (tree[k].l + tree[k].r) >> 1;
    if(x <= mm) change_point(k >> 1);
    if(y > mm) change_point(k >> 1 | 1);
    tree[k].w = tree[k >> 1].w + tree[k >> 1 | 1].w;
}
void ask_point(int k) {
    if(tree[k].l == tree[k].r) {
        ans = tree[k].w;
        return ;
    }
    if(tree[k].lazy) down(k);
    int mm = (tree[k].l + tree[k].r) >> 1;
    if(x <= mm) ask_point(k >> 1);
    else ask_point(k >> 1 | 1);
}
void ask_interval(int k) {
    if(tree[k].l >= x && tree[k].r <= y) {
        ans += tree[k].w;
        return ;
    }
    if(tree[k].lazy) down(k);
    int mm = (tree[k].l + tree[k].r) >> 1;
    if(x <= mm) ask_point(k >> 1);
    if(y > mm) ask_point(k >> 1 | 1);
}
int main(int argc, const char * argv[]) {

    return 0;
}

猜你喜欢

转载自blog.csdn.net/henu_jizhideqingwa/article/details/81475934