#include using namespace std; typedef long long ll; template ostream& operator<<(ostream &os, vector &v){ string sep = " "; if(v.size()) os << v[0]; for(int i=1; i istream& operator>>(istream &is, vector &v){ for(int i=0; i> v[i]; return is; } #ifdef DBG void debug_(){ cout << endl; } template void debug_(T&& x, Args&&... xs){ cout << x << " "; debug_(forward(xs)...); } #define dbg(...) debug_(__VA_ARGS__) #else #define dbg(...) #endif #include // Extended Euclid's greatest common divisor algorithm // Find (x, y) // where // - a*x + b*y = gcd(a, b)$ long long ext_gcd(long long a, long long b, long long &x, long long &y){ if(b == 0){ x = 1; y = 0; return a; } long long nx, ny; long long g = ext_gcd(b, a%b, nx, ny); x = ny; y = nx - a / b * ny; return g; } template struct modint { typedef long long ll; ll x; static constexpr ll mod() { return m; } constexpr modint(ll x=0): x((m+x%m)%m) {} modint operator-() const { return modint(m-x); } modint& operator+=(const modint o) { x=(x+o.x)%m; return *this; } modint& operator+=(const ll o) { return (*this)+=modint(o); } modint& operator-=(const modint o) { return (*this)+=(-o); } modint& operator-=(const ll o) { return (*this)-=modint(o); } modint& operator*=(const modint o) { x = x*o.x%m; return *this; } modint& operator*=(const ll o) { return (*this)*=modint(o); } modint& operator/=(const modint o) { return (*this)*=o.inv(); } modint& operator/=(const ll o) { return (*this)/=modint(o); } friend modint operator+(modint l, const modint r) { l+=r; return l; } friend modint operator+(modint l, const ll r) { l+=r; return l; } friend modint operator+(const ll l, modint r) { r+=l; return r; } friend modint operator-(modint l, const modint r) { l-=r; return l; } friend modint operator-(modint l, const ll r) { l-=r; return l; } friend modint operator-(const ll l, modint r) { r*=-1; r+=l; return r; } friend modint operator*(modint l, const modint r) { l*=r; return l; } friend modint operator*(modint l, const ll r) { l*=r; return l; } friend modint operator*(const ll l, modint r) { r*=l; return r; } friend modint operator/(modint l, const modint r) { l/=r; return l; } friend modint operator/(modint l, const ll r) { l/=r; return l; } friend modint operator/(const ll l, const modint r) { return modint(l)/r; } bool operator==(const modint o) const { return x==o.x; } bool operator!=(const modint o) const { return x!=o.x; } friend bool operator==(const ll l, const modint r) { return modint(l) == r; } friend bool operator!=(const ll l, const modint r) { return modint(l) != r; } friend std::ostream& operator<<(std::ostream &os, const modint x) { return os << x.x; } modint pow(ll k) const { if(k==0) return modint(1); if(k%2) return pow(k-1)*x; modint z = pow(k/2); return z*z; } modint inv() const { ll y,z; ext_gcd(x, m, y, z); return modint(y); } }; using mint = modint<>; template struct Comb { typedef long long ll; const ll m = mint::mod(); std::vector fact, fact_inv; Comb(int n_max=2000005) { fact.assign(n_max, 0); fact_inv.assign(n_max, 0); fact[0] = 1; fact_inv[0] = 1; for(int i=1; i e2+e3) return 0; else return a1*(a2*a3).inv(); } }; int main() { ios_base::sync_with_stdio(false); cout << setprecision(20) << fixed; Comb c(500000); int n, m; cin >> n >> m; mint ans = 2*n * c(2*n, n); for(int i=0; i> t >> x >> y; if(t == 1){ ans -= c(x+y, x) * c(n-x-1+n-y, n-y); } else { ans -= c(x+y, x) * c(n-x+n-y-1, n-x); } } cout << ans << endl; return 0; }