赛时代码,卡了114514年都过不了70分。
#include<bits/stdc++.h>
#define N 505
#define lowbit(x) x&(-x)
using namespace std;
int read(){
int x=0,w=1; char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*w;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>=10) write(x/10);
putchar(x%10+'0');
}
const int mod = 998244353;
int n,q;
int l[N],r[N],c[N][2];
int dp[N][N][105],dp1[N][N][105];
int Mod(int x){
if(x<0) return x+mod;
if(x>=mod) return x-mod;
return x;
}
void add(int k,int val,int id){
c[k][id]=Mod(c[k][id]+val);
}
signed main(){
n=read();q=read();
for(int i=1;i<=n;++i) l[i]=read(),r[i]=read();
for(int i=1;i<=n;++i) dp[i][i][0]=dp1[i][i][0]=1;
for(int i=1;i<=100;++i){
for(int u=1;u<=n;++u){
memset(c,0,sizeof(c));
for(int v=1;v<=n;++v){
if(l[v]==0&&r[v]==0) continue;
//c[l[v]]=Mod(c[l[v]],dp[u][v][i-1]);c[r[v]+1][0]=Mod(c[r[v]+1]-dp[u][v][i-1]);
add(l[v],dp[u][v][i-1],0); add(r[v]+1,-dp[u][v][i-1],0);
add(l[v],dp1[u][v][i-1],1); add(r[v]+1,-dp1[u][v][i-1],1);
/*
for(int j=l[v];j<=r[v];++j){
dp[u][j][i]=(dp[u][j][i]+dp[u][v][i-1])%mod;
if(j!=u) dp1[u][j][i]=(dp1[u][j][i]+dp1[u][v][i-1])%mod;
}
*/
}
int res1=0,res2=0;
for(int j=1;j<=n;++j) {
res1=Mod(res1+c[j][0]); res2=Mod(res2+c[j][1]);
dp[u][j][i]=res1; if(u!=j)dp1[u][j][i]=res2;
}
}
}
//print();
while(q--){
int a=read(),b=read(),c=read(),m=read();
if(a==c||b==c){puts("0");continue;}
if(!l[c]){printf("%d\n",Mod(dp[a][b][m]));continue;}
int ans=Mod(dp[a][b][m]);
for(int i=1;i<m;++i)
ans=Mod(ans-1ll*dp[a][c][i]*dp1[c][b][m-i]%mod);
write(ans);putchar('\n');
}
//cout<<dp[1][2][3]<<" "<<dp[2][3][2]<<endl;
return 0;
}