QAQ
【题目分析】
一道裸的剖分被一个极度sb的错误卡了两天。。。。。。
题意很明显,维护5个操作:单点修改,区间取相反数,区间求和,区间求最大值,区间求最小值。
因为求一条路径,考虑树链剖分维护(注意dfs序时优先dfs重儿子!!!这样在线段树上的编号才连续!!!)
考虑第一个操作,对于一条路径,如果修改了他的权值,那么只会对深度较浅的一个点向下走、深度较深的向上走会产生影响,所以单点修改较深点权值。(见代码update1操作)
考虑第二个操作,就是区间交换最大值最小值、区间和最大值最小值取反即可(见代码push_now操作)
考虑第三、四、五个操作,直接在树剖的时候统计答案即可。
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
const int MAXM=1e6+10;
const int INF=0x3f3f3f3f;
int n,m,cnt=1,tot;
int head[MAXN],fa[MAXN],top[MAXN],depth[MAXN],siz[MAXN],son[MAXN];
int a[MAXN],dfn[MAXN],ys[MAXN];
struct Edge{
int to,nxt,w;
}edge[MAXM];
struct node{
int l,r;
int sum,maxx,minn;
int tag;
}tr[MAXN<<2];
void push_up(int root)
{
tr[root].sum=tr[root<<1].sum+tr[root<<1|1].sum;
tr[root].maxx=max(tr[root<<1].maxx,tr[root<<1|1].maxx);
tr[root].minn=min(tr[root<<1].minn,tr[root<<1|1].minn);
}
void push_now(int root)
{
swap(tr[root].maxx,tr[root].minn);
tr[root].sum=-tr[root].sum;
tr[root].maxx=-tr[root].maxx;
tr[ro