#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
今日推荐
周排行