#include<iostream>
#include<stdio.h>
#define N 200005
#define mo 998244353
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}
int power(int x,int b){
int res=1;
while(b){
if(b&1) res=res*x%mo;
x=x*x%mo;
b>>=1;
}
return res;
}
int fac[N*2],ifac[N*2];
int cas,n,m,sze[N],son[N][2],ff[N],pool,rt,val[N],cnt;
void update(int k){
sze[k]=sze[son[k][0]]+sze[son[k][1]]+1;
}
void rotate(int x){
int fa=ff[x],gf=ff[fa],k=(son[fa][1]==x);
son[gf][(son[gf][1]==fa)]=x;
ff[x]=gf;
son[fa][k]=son[x][k^1];
ff[son[x][k^1]]=fa;
son[x][k^1]=fa;
ff[fa]=x;
update(fa),update(x);
}
void splay(int x,int goal){
while(ff[x]!=goal){
int fa=ff[x],gf=ff[fa];
if(gf!=goal)
((son[gf][1]==fa)^(son[fa][1]==x))?rotate(x):rotate(fa);
rotate(x);
}
if(!goal) rt=x;
}
int find(int x){
int now=rt;
while(x){
if(x<=sze[son[now][0]]) now=son[now][0];
else{
if(x>sze[son[now][0]]+1)
x-=(sze[son[now][0]]+1),now=son[now][1];
else break;
}
}
return now;
}
void init(int lim){
fac[0]=ifac[0]=1;
for(int i=1;i<=lim;++i) fac[i]=fac[i-1]*i%mo;
ifac[lim]=power(fac[lim],mo-2);
for(int i=lim;i>=2;--i) ifac[i-1]=ifac[i]*i%mo;
}
int C(int x,int y){
if(y>x) return 0;
return fac[x]*ifac[x-y]%mo*ifac[y]%mo;
}
signed main(){
init(N*2-1);
cas=read();
while(cas--){
n=read(),m=read();
rt=1;
pool=3;
son[1][1]=2;
ff[2]=1;
son[2][1]=3;
ff[3]=2;
sze[1]=3;
sze[2]=2;
sze[3]=1;
val[1]=val[3]=0;
val[2]=1;
for(int i=1;i<=m;++i){
read();
int x=read()+1;
int pre=find(x-1);
splay(pre,0);
int tmp=find(x);
splay(tmp,pre);
son[tmp][0]=++pool;
ff[pool]=tmp;
val[pool]=1;
val[tmp]=0;
sze[pool]=1,update(tmp),update(pre);
}
cnt=0;
for(int i=1;i<=pool;++i){
cnt+=val[i];
}
cnt+=n-m-2;
printf("%lld\n",C(n+cnt,n));
for(int i=1;i<=pool;++i){
val[i]=son[i][0]=son[i][1]=sze[i]=ff[i]=0;
}
pool=rt=0;
}
return 0;
}
时间复杂度很对了,可是连3w的点都跑不过