#include <bits/stdc++.h>
using namespace std;
template <int MOD_> struct modnum {
static constexpr int MOD = MOD_;
static_assert(MOD_ > 0, "MOD must be positive");
private:
using ll = long long;
int v;
static int minv(int a, int m) {
a %= m;
assert(a);
return a == 1 ? 1 : int(m - ll(minv(m, a)) * ll(m) / a);
}
public:
modnum() : v(0) {}
modnum(ll v_) : v(int(v_ % MOD)) { if (v < 0) v += MOD; }
explicit operator int() const { return v; }
friend std::ostream& operator << (std::ostream& out, const modnum& n) { return out << int(n); }
friend std::istream& operator >> (std::istream& in, modnum& n) { ll v_; in >> v_; n = modnum(v_); return in; }
friend bool operator == (const modnum& a, const modnum& b) { return a.v == b.v; }
friend bool operator != (const modnum& a, const modnum& b) { return a.v != b.v; }
modnum inv() const {
modnum res;
res.v = minv(v, MOD);
return res;
}
friend modnum inv(const modnum& m) { return m.inv(); }
modnum neg() const {
modnum res;
res.v = v ? MOD-v : 0;
return res;
}
friend modnum neg(const modnum& m) { return m.neg(); }
modnum operator- () const {
return neg();
}
modnum operator+ () const {
return modnum(*this);
}
modnum& operator ++ () {
v ++;
if (v == MOD) v = 0;
return *this;
}
modnum& operator -- () {
if (v == 0) v = MOD;
v --;
return *this;
}
modnum& operator += (const modnum& o) {
v += o.v;
if (v >= MOD) v -= MOD;
return *this;
}
modnum& operator -= (const modnum& o) {
v -= o.v;
if (v < 0) v += MOD;
return *this;
}
modnum& operator *= (const modnum& o) {
v = int(ll(v) * ll(o.v) % MOD);
return *this;
}
modnum& operator /= (const modnum& o) {
return *this *= o.inv();
}
friend modnum operator ++ (modnum& a, int) { modnum r = a; ++a; return r; }
friend modnum operator -- (modnum& a, int) { modnum r = a; --a; return r; }
friend modnum operator + (const modnum& a, const modnum& b) { return modnum(a) += b; }
friend modnum operator - (const modnum& a, const modnum& b) { return modnum(a) -= b; }
friend modnum operator * (const modnum& a, const modnum& b) { return modnum(a) *= b; }
friend modnum operator / (const modnum& a, const modnum& b) { return modnum(a) /= b; }
};
template <typename T> T pow(T a, long long b) {
assert(b >= 0);
T r = 1; while (b) { if (b & 1) r *= a; b >>= 1; a *= a; } return r;
}
using num = modnum<int(1e9) + 7>;
const int MAXN = 1.1e5;
const int MAXK = 11;
struct segtree {
static const int S = 1<<18;
struct seg_node {
num sum;
num m;
num a;
} seg[S*2];
void affine(int i, num m, num a, int len) {
if (m == 1 && a == 0) return;
auto& n = seg[i];
n.sum *= m;
n.sum += a * len;
n.m *= m;
n.a *= m;
n.a += a;
}
void propagate(int i, int len) {
assert(i < S);
auto& n = seg[i];
if (n.m != 1 || n.a != 0) {
affine(2*i, n.m, n.a, len/2);
affine(2*i+1, n.m, n.a, len/2);
n.m = 1, n.a = 0;
}
}
void update(int i, int l, int r, int ql, int qr, num m, num a) {
if (qr <= l || r <= ql) return;
if (ql <= l && r <= qr) {
affine(i, m, a, r-l);
} else {
propagate(i, r-l);
int md = (l+r)/2;
update(2*i, l, md, ql, qr, m, a);
update(2*i+1, md, r, ql, qr, m, a);
seg[i].sum = seg[2*i].sum + seg[2*i+1].sum;
}
}
num query(int i, int l, int r, int ql, int qr) {
if (qr <= l || r <= ql) return 0;
if (ql <= l && r <= qr) {
return seg[i].sum;
} else {
propagate(i, r-l);
int md = (l+r)/2;
return query(2*i, l, md, ql, qr) + query(2*i+1, md, r, ql, qr);
}
}
void update(int ql, int qr, num m, num a) {
update(1, 0, S, ql, qr, m, a);
}
num query(int ql, int qr) {
return query(1, 0, S, ql, qr);
}
} segs[MAXK];
int N, K;
pair<int, int> S[MAXN];
num stirling[MAXK][MAXK];
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> N >> K;
for (int i = 0; i < N; i++) {
int l, r; cin >> l >> r;
S[i] = {l,r};
}
sort(S, S+N);
segs[0].update(0, 1, 1, 1);
for (int i = 0; i < N; i++) {
int l, r; tie(l, r) = S[i];
for (int k = 0; k <= K; k++) {
segs[k].update(r, r+1, 1, segs[k].query(0, r));
if (k >= 1) {
segs[k].update(r, r+1, 1, segs[k-1].query(0, l));
}
segs[k].update(r+1, 2*N+1, 2, 0);
}
}
stirling[0][0] = 1;
for (int i = 1; i <= K; i++) {
for (int j = 1; j <= i; j++) {
stirling[i][j] = stirling[i-1][j-1] + stirling[i-1][j] * j;
}
}
num ans = 0;
num fact = 1;
for (int k = 1; k <= K; k++) {
num tot = segs[k].seg[1].sum;
fact *= k;
ans += fact * tot * stirling[K][k];
}
cout << ans << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8aW50IE1PRF8+IHN0cnVjdCBtb2RudW0gewoJc3RhdGljIGNvbnN0ZXhwciBpbnQgTU9EID0gTU9EXzsKCXN0YXRpY19hc3NlcnQoTU9EXyA+IDAsICJNT0QgbXVzdCBiZSBwb3NpdGl2ZSIpOwoKcHJpdmF0ZToKCXVzaW5nIGxsID0gbG9uZyBsb25nOwoKCWludCB2OwoKCXN0YXRpYyBpbnQgbWludihpbnQgYSwgaW50IG0pIHsKCQlhICU9IG07CgkJYXNzZXJ0KGEpOwoJCXJldHVybiBhID09IDEgPyAxIDogaW50KG0gLSBsbChtaW52KG0sIGEpKSAqIGxsKG0pIC8gYSk7Cgl9CgpwdWJsaWM6CgoJbW9kbnVtKCkgOiB2KDApIHt9Cgltb2RudW0obGwgdl8pIDogdihpbnQodl8gJSBNT0QpKSB7IGlmICh2IDwgMCkgdiArPSBNT0Q7IH0KCWV4cGxpY2l0IG9wZXJhdG9yIGludCgpIGNvbnN0IHsgcmV0dXJuIHY7IH0KCWZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgbW9kbnVtJiBuKSB7IHJldHVybiBvdXQgPDwgaW50KG4pOyB9CglmcmllbmQgc3RkOjppc3RyZWFtJiBvcGVyYXRvciA+PiAoc3RkOjppc3RyZWFtJiBpbiwgbW9kbnVtJiBuKSB7IGxsIHZfOyBpbiA+PiB2XzsgbiA9IG1vZG51bSh2Xyk7IHJldHVybiBpbjsgfQoKCWZyaWVuZCBib29sIG9wZXJhdG9yID09IChjb25zdCBtb2RudW0mIGEsIGNvbnN0IG1vZG51bSYgYikgeyByZXR1cm4gYS52ID09IGIudjsgfQoJZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IG1vZG51bSYgYSwgY29uc3QgbW9kbnVtJiBiKSB7IHJldHVybiBhLnYgIT0gYi52OyB9CgoJbW9kbnVtIGludigpIGNvbnN0IHsKCQltb2RudW0gcmVzOwoJCXJlcy52ID0gbWludih2LCBNT0QpOwoJCXJldHVybiByZXM7Cgl9CglmcmllbmQgbW9kbnVtIGludihjb25zdCBtb2RudW0mIG0pIHsgcmV0dXJuIG0uaW52KCk7IH0KCW1vZG51bSBuZWcoKSBjb25zdCB7CgkJbW9kbnVtIHJlczsKCQlyZXMudiA9IHYgPyBNT0QtdiA6IDA7CgkJcmV0dXJuIHJlczsKCX0KCWZyaWVuZCBtb2RudW0gbmVnKGNvbnN0IG1vZG51bSYgbSkgeyByZXR1cm4gbS5uZWcoKTsgfQoKCW1vZG51bSBvcGVyYXRvci0gKCkgY29uc3QgewoJCXJldHVybiBuZWcoKTsKCX0KCW1vZG51bSBvcGVyYXRvcisgKCkgY29uc3QgewoJCXJldHVybiBtb2RudW0oKnRoaXMpOwoJfQoKCW1vZG51bSYgb3BlcmF0b3IgKysgKCkgewoJCXYgKys7CgkJaWYgKHYgPT0gTU9EKSB2ID0gMDsKCQlyZXR1cm4gKnRoaXM7Cgl9Cgltb2RudW0mIG9wZXJhdG9yIC0tICgpIHsKCQlpZiAodiA9PSAwKSB2ID0gTU9EOwoJCXYgLS07CgkJcmV0dXJuICp0aGlzOwoJfQoJbW9kbnVtJiBvcGVyYXRvciArPSAoY29uc3QgbW9kbnVtJiBvKSB7CgkJdiArPSBvLnY7CgkJaWYgKHYgPj0gTU9EKSB2IC09IE1PRDsKCQlyZXR1cm4gKnRoaXM7Cgl9Cgltb2RudW0mIG9wZXJhdG9yIC09IChjb25zdCBtb2RudW0mIG8pIHsKCQl2IC09IG8udjsKCQlpZiAodiA8IDApIHYgKz0gTU9EOwoJCXJldHVybiAqdGhpczsKCX0KCW1vZG51bSYgb3BlcmF0b3IgKj0gKGNvbnN0IG1vZG51bSYgbykgewoJCXYgPSBpbnQobGwodikgKiBsbChvLnYpICUgTU9EKTsKCQlyZXR1cm4gKnRoaXM7Cgl9Cgltb2RudW0mIG9wZXJhdG9yIC89IChjb25zdCBtb2RudW0mIG8pIHsKCQlyZXR1cm4gKnRoaXMgKj0gby5pbnYoKTsKCX0KCglmcmllbmQgbW9kbnVtIG9wZXJhdG9yICsrIChtb2RudW0mIGEsIGludCkgeyBtb2RudW0gciA9IGE7ICsrYTsgcmV0dXJuIHI7IH0KCWZyaWVuZCBtb2RudW0gb3BlcmF0b3IgLS0gKG1vZG51bSYgYSwgaW50KSB7IG1vZG51bSByID0gYTsgLS1hOyByZXR1cm4gcjsgfQoJZnJpZW5kIG1vZG51bSBvcGVyYXRvciArIChjb25zdCBtb2RudW0mIGEsIGNvbnN0IG1vZG51bSYgYikgeyByZXR1cm4gbW9kbnVtKGEpICs9IGI7IH0KCWZyaWVuZCBtb2RudW0gb3BlcmF0b3IgLSAoY29uc3QgbW9kbnVtJiBhLCBjb25zdCBtb2RudW0mIGIpIHsgcmV0dXJuIG1vZG51bShhKSAtPSBiOyB9CglmcmllbmQgbW9kbnVtIG9wZXJhdG9yICogKGNvbnN0IG1vZG51bSYgYSwgY29uc3QgbW9kbnVtJiBiKSB7IHJldHVybiBtb2RudW0oYSkgKj0gYjsgfQoJZnJpZW5kIG1vZG51bSBvcGVyYXRvciAvIChjb25zdCBtb2RudW0mIGEsIGNvbnN0IG1vZG51bSYgYikgeyByZXR1cm4gbW9kbnVtKGEpIC89IGI7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIHBvdyhUIGEsIGxvbmcgbG9uZyBiKSB7Cglhc3NlcnQoYiA+PSAwKTsKCVQgciA9IDE7IHdoaWxlIChiKSB7IGlmIChiICYgMSkgciAqPSBhOyBiID4+PSAxOyBhICo9IGE7IH0gcmV0dXJuIHI7Cn0KCnVzaW5nIG51bSA9IG1vZG51bTxpbnQoMWU5KSArIDc+OwoKY29uc3QgaW50IE1BWE4gPSAxLjFlNTsKY29uc3QgaW50IE1BWEsgPSAxMTsKCnN0cnVjdCBzZWd0cmVlIHsKCXN0YXRpYyBjb25zdCBpbnQgUyA9IDE8PDE4OwoJc3RydWN0IHNlZ19ub2RlIHsKCQludW0gc3VtOwoJCW51bSBtOwoJCW51bSBhOwoJfSBzZWdbUyoyXTsKCgl2b2lkIGFmZmluZShpbnQgaSwgbnVtIG0sIG51bSBhLCBpbnQgbGVuKSB7CgkJaWYgKG0gPT0gMSAmJiBhID09IDApIHJldHVybjsKCQlhdXRvJiBuID0gc2VnW2ldOwoJCW4uc3VtICo9IG07CgkJbi5zdW0gKz0gYSAqIGxlbjsKCQluLm0gKj0gbTsKCQluLmEgKj0gbTsKCQluLmEgKz0gYTsKCX0KCgl2b2lkIHByb3BhZ2F0ZShpbnQgaSwgaW50IGxlbikgewoJCWFzc2VydChpIDwgUyk7CgkJYXV0byYgbiA9IHNlZ1tpXTsKCQlpZiAobi5tICE9IDEgfHwgbi5hICE9IDApIHsKCQkJYWZmaW5lKDIqaSwgbi5tLCBuLmEsIGxlbi8yKTsKCQkJYWZmaW5lKDIqaSsxLCBuLm0sIG4uYSwgbGVuLzIpOwoJCQluLm0gPSAxLCBuLmEgPSAwOwoJCX0KCX0KCgl2b2lkIHVwZGF0ZShpbnQgaSwgaW50IGwsIGludCByLCBpbnQgcWwsIGludCBxciwgbnVtIG0sIG51bSBhKSB7CgkJaWYgKHFyIDw9IGwgfHwgciA8PSBxbCkgcmV0dXJuOyAKCQlpZiAocWwgPD0gbCAmJiByIDw9IHFyKSB7CgkJCWFmZmluZShpLCBtLCBhLCByLWwpOwoJCX0gZWxzZSB7CgkJCXByb3BhZ2F0ZShpLCByLWwpOwoJCQlpbnQgbWQgPSAobCtyKS8yOwoJCQl1cGRhdGUoMippLCBsLCBtZCwgcWwsIHFyLCBtLCBhKTsKCQkJdXBkYXRlKDIqaSsxLCBtZCwgciwgcWwsIHFyLCBtLCBhKTsKCQkJc2VnW2ldLnN1bSA9IHNlZ1syKmldLnN1bSArIHNlZ1syKmkrMV0uc3VtOwoJCX0KCX0KCgludW0gcXVlcnkoaW50IGksIGludCBsLCBpbnQgciwgaW50IHFsLCBpbnQgcXIpIHsKCQlpZiAocXIgPD0gbCB8fCByIDw9IHFsKSByZXR1cm4gMDsgCgkJaWYgKHFsIDw9IGwgJiYgciA8PSBxcikgewoJCQlyZXR1cm4gc2VnW2ldLnN1bTsKCQl9IGVsc2UgewoJCQlwcm9wYWdhdGUoaSwgci1sKTsKCQkJaW50IG1kID0gKGwrcikvMjsKCQkJcmV0dXJuIHF1ZXJ5KDIqaSwgbCwgbWQsIHFsLCBxcikgKyBxdWVyeSgyKmkrMSwgbWQsIHIsIHFsLCBxcik7CgkJfQoJfQoKCXZvaWQgdXBkYXRlKGludCBxbCwgaW50IHFyLCBudW0gbSwgbnVtIGEpIHsKCQl1cGRhdGUoMSwgMCwgUywgcWwsIHFyLCBtLCBhKTsKCX0KCgludW0gcXVlcnkoaW50IHFsLCBpbnQgcXIpIHsKCQlyZXR1cm4gcXVlcnkoMSwgMCwgUywgcWwsIHFyKTsKCX0KfSBzZWdzW01BWEtdOwoKaW50IE4sIEs7CnBhaXI8aW50LCBpbnQ+IFNbTUFYTl07CgpudW0gc3RpcmxpbmdbTUFYS11bTUFYS107CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKDApLCBjaW4udGllKDApOwoKCWNpbiA+PiBOID4+IEs7Cglmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewoJCWludCBsLCByOyBjaW4gPj4gbCA+PiByOwoJCVNbaV0gPSB7bCxyfTsKCX0KCXNvcnQoUywgUytOKTsKCglzZWdzWzBdLnVwZGF0ZSgwLCAxLCAxLCAxKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CgkJaW50IGwsIHI7IHRpZShsLCByKSA9IFNbaV07CgoJCWZvciAoaW50IGsgPSAwOyBrIDw9IEs7IGsrKykgewoJCQlzZWdzW2tdLnVwZGF0ZShyLCByKzEsIDEsIHNlZ3Nba10ucXVlcnkoMCwgcikpOwoJCQlpZiAoayA+PSAxKSB7CgkJCQlzZWdzW2tdLnVwZGF0ZShyLCByKzEsIDEsIHNlZ3Nbay0xXS5xdWVyeSgwLCBsKSk7CgkJCX0KCQkJc2Vnc1trXS51cGRhdGUocisxLCAyKk4rMSwgMiwgMCk7CgkJfQoJfQoKCXN0aXJsaW5nWzBdWzBdID0gMTsKCWZvciAoaW50IGkgPSAxOyBpIDw9IEs7IGkrKykgewoJCWZvciAoaW50IGogPSAxOyBqIDw9IGk7IGorKykgewoJCQlzdGlybGluZ1tpXVtqXSA9IHN0aXJsaW5nW2ktMV1bai0xXSArIHN0aXJsaW5nW2ktMV1bal0gKiBqOwoJCX0KCX0KCgludW0gYW5zID0gMDsKCW51bSBmYWN0ID0gMTsKCWZvciAoaW50IGsgPSAxOyBrIDw9IEs7IGsrKykgewoJCW51bSB0b3QgPSBzZWdzW2tdLnNlZ1sxXS5zdW07CgoJCWZhY3QgKj0gazsKCQlhbnMgKz0gZmFjdCAqIHRvdCAqIHN0aXJsaW5nW0tdW2tdOwoJfQoJY291dCA8PCBhbnMgPDwgJ1xuJzsKCglyZXR1cm4gMDsKfQo=