线段树模板1,只写了给区间加数的函数(我都觉得好傻)
#include <bits/stdc++.h>
#define ll long long
#define rep(i, a, b) for(ll (i) = (a); (i) <= (b); (i)++)
#define per(i, a, b) for(ll (i) = (a); (i) >= (b); (i)--)
using namespace std;
const int N = 4e5 + 5;
ll n, m, k;
ll x, y, z;
struct Node
{
ll num, lazy;
};
Node a[N];
inline ll read(){
ll x = 0,f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
return x * f;
}
void write(ll x, char c, int i){
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10, c, i + 1);
putchar(x % 10 + '0');
if (!i) putchar(c);
return;
}
void build(ll l, ll r, ll cn, ll id){
a[id].num += k, a[id].lazy = 0;
if (l == r) return;
ll mid = (l + r) >> 1;
if (l <= cn && cn <= mid) build(l, mid, cn, id * 2);
else build(mid + 1, r, cn, id * 2 + 1);
return;
}
void add(ll l, ll r, ll cn, ll id){
a[id].num += (r - l + 1) * cn;
if (l == r)
{
return;
}
ll mid = (l + r) >> 1;
if (l <= x && x <= mid)
{
if (x <= y && y <= mid)
{
if (x == l && y == r)
{
return;
}
}
add(l, mid, cn, id * 2);
}
else if (mid < x && x <= r)
{
if (x <= y && y <= r)
{
if (x == mid + 1 && y == r)
{
return;
}
}
add(mid + 1, r, cn, id * 2 + 1);
}
return;
}
int main()
{
n = read(), m = read();
rep (i, 1, n)
{
k = read();
build(1, n, i, 1);
}
//print(1, n, 1);
rep (i, 1, m)
{
k = read();
if (k == 1)
{
x = read(), y = read();
}
else if (k == 2)
{
x = read(), y = read(), z = read();
add(1, n, z, 1);
}
}
print(1, n, 1);
return 0;
}
如果骂了就帮我看错哪了,怎么加lazy标记
void print(ll l, ll r, ll id){//调试代码,打印线段树
cout << l << " " << r << " " << a[id].num << " " << a[id].lazy << endl;
if (l == r) return;
ll mid = (l + r) >> 1;
print(l, mid, id * 2);
print(mid + 1, r, id * 2 + 1);
return;
}
小蒟蒻纯自学,错的太离谱就紫衫