线段树(区间查询,区间修改)——标记永久化版
传送门: https://www.luogu.org/problem/P3372 为了不下传add的标记,改为在询问的过程当中计算每个遇到的节点对当前询问的影响。而为了保证询问的复杂度,子节点的影响需要在修改操作时计算好。因此实际上,add的值表示这个区间共同加上的值,seg表示这个区间内除了add之外其它数的值的和。需要注意,区间的add值可能有一部分在祖先节点上,这在递归时累加即可。 1 #include<bits/stdc++.h> 2 using namespace std; 3 long long n,m; 4 long long num[500009]; 5 long long seg[500009];//线段树上除了add之外的值 6 long long add[500009];//当前区间共同加上的值 7 inline long long read() 8 { 9 long long x=0,f=1;char ch=getchar(); 10 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 11 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 12 return x*f; 13 } 14 inline long long ls