C Tokitsukaze and a+b=n (hard) {FriedChicken代码+注解}

#include<iostream> 
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int, int> pii;
typedef pair<db, db> pdd;

const int Mo=998244353;
const int N=2e5+6;

ll l,r,L,R,n,m;

ll sum[N];

int main(){
    
    scanf("%lld %lld",&n,&m);
    
    ll ans=0;
    for(int i=1;i<=m;i++){
        scanf("%lld %lld",&l,&r);
        
        sum[l]++;
        sum[r+1]--;//差分
        
        L=n-r;
        R=n-l;//
        ans-=max(0ll,min(R,r)-max(l,L)+1);//去掉会重复的情况,也就是自己和自己匹配的情况
        ans%=Mo;
    }
    if(ans<0) ans+=Mo;
    
    for(int i=1;i<=N-6;i++){
        sum[i]+=sum[i-1];
        sum[i]%=Mo;
    }//前缀和恢复成原数组
    
    for(int i=1;i<=n;i++){
        int j=n-i;
        if(i>N-6||j>N-6) continue;//防止越界情况
        ans=(ans+sum[i]*sum[j])%Mo;
    }
    
    cout<<ans;
	return 0;
}