这代码里面应该有Undefined Behavior,各位帮我找一下
#include<cstdio>
#include<cstring>
using namespace std;
template<class T>inline void read(T&a){
char c=getchar();int f=1;a=0;
while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}
while(c<='9'&&c>='0') a=(a<<1)+(a<<3)+c-48,c=getchar();
a*=f;
}
template<class T>void write(T a){
if(a<0) putchar('-'),a=-a;
if(a>9) write(a/10);
putchar(a%10+48);
}
const int o=1e5+10;
int T,n,l,r,rt[o],cnt,dis[o],val[o],id[o],ls[o],rs[o],nod[o],ans;
inline int nwnd(int VAL,int ID){dis[++cnt]=ls[cnt]=rs[cnt]=0;val[cnt]=VAL;id[cnt]=ID;nod[ID]=cnt;return cnt;}
int merge(int x,int y){
if(!x||!y) return x+y;
if(val[x]>val[y]) x^=y,y^=x,x^=y;
rs[x]=merge(rs[x],y);
if(dis[rs[x]]>dis[ls[x]]) rs[x]^=ls[x],ls[x]^=rs[x],rs[x]^=ls[x];
dis[x]=(rs[x]?(dis[rs[x]]+1):0);
return x;
}
int main(){
read(T);while(T--){
read(n);cnt=0;memset(rt,0,sizeof rt);ans=1;
for(int i=1;i<=n;++i) read(l),read(r),rt[l]=merge(rt[l],nwnd(r,i));
for(int i=1;i<=n;++i){
while(rt[i]&&val[rt[i]]<i) rt[i]=merge(ls[rt[i]],rs[rt[i]]);
if(!rt[i]){ans=0;break;}
int VAL=val[rt[i]],ID=id[rt[i]];rt[i]=merge(ls[rt[i]],rs[rt[i]]);
rt[VAL+1]=merge(rt[VAL+1],rt[i]);
if(ID!=i) ans*=-1,id[nod[i]]=ID,nod[ID]=nod[i];
}
putchar((ans==-1)?('F'):((ans==0)?'D':'Y'));putchar('\n');
}
return 0;
}