想问一下这两种维护区间次大值的方法是不是都没有问题 洛谷上是都过了 谢谢
void dfs(int u,int f){
dep[u]=dep[f]+1;
fa[u][0]=f;
cma[u][0]=-0x3f3f3f3f;
for(int i=1;(1<<i)<=dep[u];i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
int kk[4]={ma[u][i-1],ma[fa[u][i-1]][i-1],cma[u][i-1],cma[fa[u][i-1]][i-1]};
std::sort(kk,kk+4);
ma[u][i]=kk[3];
int ptr=2;
while(ptr>=0&&kk[ptr]==kk[3]) ptr--;
// if(ptr==0) cout<<"&&&&&";
if(ptr==-1) cma[u][i]=-0x3f3f3f3f;
else cma[u][i]=kk[ptr];
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f) continue;
ma[v][0]=e[i].w;
dfs(v,u);
}
}
void dfs(int u,int f){
dep[u]=dep[f]+1;
fa[u][0]=f;
cma[u][0]=-0x3f3f3f3f;
for(int i=1;(1<<i)<=dep[u];i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
int kk[4]={ma[u][i-1],ma[fa[u][i-1]][i-1],cma[u][i-1],cma[fa[u][i-1]][i-1]};
std::sort(kk,kk+4);
ma[u][i]=kk[3];
int ptr=2;
while(ptr>=2&&kk[ptr]==kk[3]) ptr--;
cma[u][i]=kk[ptr];
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f) continue;
ma[v][0]=e[i].w;
dfs(v,u);
}
}