(下截题解第二篇)
Tree ask(int k,int x,int y)//询问函数,因为每次返回的maxleft等值不一定是左右儿子的数据,所以要返回一个结构体
{
if(x<=tree[k].l&&tree[k].r<=y)
{
return tree[k];
}
int mid=(tree[k].l+tree[k].r)/2;
if(y<=mid) return ask(k*2,x,y);//如果访问的区间全在左儿子里,直接return
else
{
if(x>mid) return ask(k*2+1,x,y);//如果访问的区间全在右儿子里,也直接return
else
{//否则就左右儿子都访问,然后合并区间
Tree t,a=ask(k*2,x,y),b=ask(k*2+1,x,y);
t.maxleft=max(a.maxleft,a.sum+b.maxleft);//做类似的合并区间
t.maxright=max(b.maxright,a.maxright+b.sum);
t.ans=max(max(a.ans,b.ans),a.maxright+b.maxleft);
return t;//返回合并后的区间
}
}
}
while(m--)
{
int choose,x,y;
scanf("%d%d%d",&choose,&x,&y);
if(choose==1)
{
if(x>y)swap(x,y);//这是个坑点,因为题目没有注明x<=y,就是因为这个我调了半天QAQ,最后还是看讨论才知道的,感谢讨论的巨佬们
printf("%lld\n",ask(1,x,y).ans);
}
else
{
change(1,x,y);
}
}
RT 为什么询问的时候能保证返回的区间完整呢?