为什么这个代码不开longlong会错,开了就AC了?
#include <bits/stdc++.h>
#define int long long
using namespace std;
int logn[100005];
void init(){
logn[1]=0;
logn[2]=1;
for (int i=3;i<=100000;i++){
logn[i]=logn[i/2]+1;
}
}
int t;
int n,m,q,num;
int a[200005];
struct edge{
int u,v,w;
bool operator <(edge &other){
return w<other.w;
}
}e[200005];
int head[200005],to[400005],nxt[400005],cnt;
void addedge(int u,int v){
to[++cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
}
int fa[200005];
int find (int x){
if (fa[x]==x){
return x;
}else{
return fa[x]=find(fa[x]);
}
}
int f[200005][22];
int dep[200005];
void dfs(int u,int fa){
f[u][0]=fa;
dep[u]=dep[fa]+1;
for (int i=1;i<=20;i++){
f[u][i]=f[f[u][i-1]][i-1];
}
for (int i=head[u];~i;i=nxt[i]){
int v=to[i];
if (v==fa){
continue;
}
dfs(v,u);
}
}
int lca(int x,int y){
if (dep[x]<dep[y]){
swap(x,y);
}
for (int i=dep[x]-dep[y],k=0;i;i>>=1,k++){
if (i&1){
x=f[x][k];
}
}
if (x==y){
return x;
}
for (int i=20;i>=0;i--){
if (f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int st[100005][22];
signed main(){
init();
scanf ("%lld",&t);
while (t--){
memset(head,-1,sizeof(head));
cnt=0;
scanf ("%lld%lld%lld",&n,&m,&q);
num=n;
for (int i=1;i<=2*n-1;i++){
fa[i]=i;
}
for (int i=1;i<=m;i++){
scanf ("%lld%lld",&e[i].u,&e[i].v);
e[i].w=i;
}
sort(e+1,e+1+m);
for (int i=1;i<=m;i++){
int fu=find(e[i].u);
int fv=find(e[i].v);
if (fu!=fv){
fa[fu]=++num;
fa[fv]=num;
a[num]=e[i].w;
addedge(fu,num);
addedge(num,fu);
addedge(fv,num);
addedge(num,fv);
}
if (num==2*n-1){
break;
}
}
dfs(num,0);
for (int i=1;i<=n-1;i++){
st[i][0]=a[lca(i,i+1)];
}
for (int j=1;j<=20;j++){
for (int i=1;i+(1<<j)-1<=n-1;i++){
st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
while (q--){
int l,r;
scanf ("%lld%lld",&l,&r);
if (l==r){
printf ("0 ");
continue;
}
r--;
int s=logn[r-l+1];
printf ("%lld ",max(st[l][s],st[r-(1<<s)+1][s]));
}
printf ("\n");
}
}