现在重写,其实算是个比较经典的做法了吧,利用dfs到的时间戳构建一个线段树,
然后就是不难想的基本操作改改了。
注意:懒惰标记不要搞错,如果对一个点有2个懒惰标记这个点懒惰标记取0.
/*
author:ray007great
version:1.0
*/
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
/* define */
#define sf(a) scanf("%d",&a)
#define sfs(a) scanf("%s",a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repd(i,a,b) for(int i=(a);i>=(b);i--)
#define rep1(i,a,b) for(int i=(a);i<(b);i++)
#define clr(a) memset(a,0,sizeof(a))
#define pfk printf("fuck\n")
/* define */
const int N = 310000;
int clock1;
int lleft[N],rright[N];
int val[4*N],lazy[4*N];
vector g[N];
void dfs(int x){
if(lleft[x]) return ;
lleft[x]=++clock1;
int sz=g[x].size();
for(int i=0;i
>1;
if(lazy[o]){
Cov(l,m,o<<1);Cov(m+1,r,o<<1|1);
lazy[o]=0;
}
}
int ql,qr;//query range
int query(int l,int r,int o){
if(l>=ql && r<=qr) return val[o];
release(l,r,o);
int m=(l+r)>>1,res=0;
if(ql<=m) res+=query(l,m,o<<1);
if(m=ul && r<=ur){
Cov(l,r,o);return ;
}
release(l,r,o);
int m=(l+r)>>1;
if(ul<=m) update(l,m,o<<1);
if(m