裸地不能在裸的树链剖分了,col忘记清空,狂wa一小时。
本来想学LINK CUT TREE的,考试接踵,做题状态全无。== ==暂时顺延了
#include
#include
#include
#include
#include
using namespace std;
#define INF 0x3ffffff
#define MAXN 100010
struct node
{
int to,next;
}edge[9999999];
int head[MAXN],en;
int belong[MAXN],idx[MAXN],qid[MAXN],fi[MAXN];
int top[MAXN],len[MAXN];
int dep[MAXN],fat[MAXN],size[MAXN];
int Q[MAXN],vis[MAXN];
int n,m,k,cnt;
int a[MAXN],f[MAXN];
void add(int u,int v)
{
edge[en].to=v;
edge[en].next=head[u];
head[u]=en++;
}
void split()
{
int l,r;
memset(dep,-1,sizeof(dep));
l=0;
dep[Q[r=1]=1]=0;
fat[1]=-1;
while(lsize[p])
p=edge[y].to;
}
if(p==-1)
{
idx[x]=len[++cnt]=1;
belong[top[cnt]=x]=cnt;
}
else
{
idx[x]=++len[belong[x]=belong[p]];
top[belong[x]]=x;
}
vis[x]=true;
}
}
void getqid()
{
fi[1]=1;
for(int i=2;i<=cnt;i++)
fi[i]=fi[i-1]+len[i-1];
for(int i=1;i<=n;i++)
{
int blo=belong[i];
qid[i]=fi[blo]+len[blo]-idx[i];
f[qid[i]]=i;
}
}
void update(int l,int r,int root,int L,int R,int d);
void change(int x,int y,int d)
{
while(belong[x]!=belong[y])
{
if(dep[top[belong[x]]]dep[y]) swap(x,y);
update(1,n,1,qid[x],qid[y],d); //其他数据结构维护区间值
}
#define lson l,m,root<<1
#define rson m+1,r,root<<1|1
int node[MAXN<<2],col[MAXN<<2];
void push_up(int root)
{
node[root]=max(node[root<<1],node[root<<1|1]);
}
void push_down(int root,int m)
{
if(col[root])
{
col[root<<1|1]+=col[root];
col[root<<1]+=col[root];
node[root<<1]=node[root<<1]+(m-(m>>1))*col[root];
node[root<<1|1]=node[root<<1|1]+(m>>1)*col[root];
col[root]=0;
}
}
void build(int l,int r,int root)
{
col[root]=0;
if(l==r)
{
node[root]=a[f[l]];
return ;
}
int m=(l+r)>>1;
build(lson);
build(rson);
push_up(root);
}
void update(int l,int r,int root,int L,int R,int d)
{
if(l>=L&&r<=R)
{
node[root]+=(r-l+1)*d;
col[root]+=d;
return ;
}
int m=(l+r)>>1;
push_down(root,r-l+1);
if(L<=m) update(lson,L,R,d);
if(R>m) update(rson,L,R,d);
push_up(root);
}
int query(int l,int r,int root,int a)
{
if(l==r) return node[root];
int m=(l+r)>>1;
push_down(root,r-l+1);
int ret=0;
if(a<=m)
ret= query(lson,a);
else
ret= query(rson,a);
push_up(root);
return ret;
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
int u,v,x;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(head,-1,sizeof(head));en=0;
for(int i=0;i