如果你的update是如下写法:
void upd(int u,int L,int R,int l,int r){
if(L==R&&L>=l&&R<=r){
t[u].w==sqrt(t[u].w);
t[u].mx=sqrt(t[u].w);
return;
}
int mid=(L+R)>>1;
if(l<=mid&&t[u*2].mx>1)upd(u*2,L,mid,l,r);
if(mid<r&&t[u*2+1].mx>1)upd(u*2+1,mid+1,R,l,r);
pushup(u);
}
请把第一个 if 改成下面那样,否则你的 max 会开2次根。
if(L==R&&L>=l&&R<=r){
t[u].w=t[u].mx=sqrt(t[u].w);
return;
}