#include <bits/stdc++.h>   using namespace std;   const int N = 2000020;   pair<int, int> a[N], b[N];   bool comp(int x, int y) { return a[x].second > a[y].second; }   int n, m, K;   vector<int> A[N], B[N];   int g[4 * N];   bool t[4 * N];   long long T[4 * N];   set<pair<int, int> > S;   set<pair<int, int> >::iterator it;   int sum(int v, int tl, int tr, int x) {     if (tl > x || tr <= x) return 0;     if (tl == tr - 1) return g[v];     int xy, yy;     xy = sum(v + v, tl, tl + tr >> 1, x);     yy = sum(v + v + 1, tl + tr >> 1, tr, x);     return max(xy, yy) + g[v];   }   void add(int v, int tl, int tr, int l, int r, int x) {     if (tl >= r || tr <= l) return;     if (l <= tl && tr <= r) {       g[v] += x;       return;     }     add(v + v, tl, tl + tr >> 1, l, r, x);     add(v + v + 1, tl + tr >> 1, tr, l, r, x);   }   void upd1(int v) {     if (t[v]) {       T[v + v] = T[v + v + 1] = T[v];       t[v + v + 1] = t[v + v] = t[v];       t[v] = false;     }   }   void update(int v, int tl, int tr, int l, int r, long long x) {     if (tl >= r || tr <= l) return;     upd1(v);     if (l <= tl && tr <= r) {       T[v] = x;       t[v] = true;       return;     }     update(v + v, tl, tl + tr >> 1, l, r, x);     update(v + v + 1, tl + tr >> 1, tr, l, r, x);     T[v] = (T[v + v] + T[v + v + 1]) % 1000000007ll;   }   long long get(int v, int tl, int tr, int l, int r) {     if (tl >= r || tr <= l) return 0;     upd1(v);     if (l <= tl && tr <= r) return T[v];     long long x, y;     x = get(v + v, tl, tl + tr >> 1, l, r);     y = get(v + v + 1, tl + tr >> 1, tr, l, r);     T[v] = (T[v + v] + T[v + v + 1]) % 1000000007ll;     return (x + y) % 1000000007ll;   }   int main() {     scanf( %d %d %d , &m, &n, &K);     for (int i = 0; i < K; ++i) {       scanf( %d %d , &b[i].first, &a[i].first);       scanf( %d %d , &b[i].second, &a[i].second);       A[b[i].first].push_back(i);       B[b[i].second + 1].push_back(i);     }     update(1, 1, n + 1, 1, 2, 1);     B[1].push_back(K);     a[K].second = n;     a[K].first = 1;     S.insert(make_pair(a[K].second, K));     add(1, 1, n + 1, 1, n + 1, 1);     for (int k = 1; k <= m; ++k) {       sort(A[k].begin(), A[k].end(), comp);       for (int i = 0; i < A[k].size(); ++i) {         int v = A[k][i];         int s = sum(1, 1, n + 1, a[v].second + 1);         if (s == 0) {           it = S.lower_bound(make_pair(a[v].second + 1, 0));           int l = 0;           if (it != S.begin()) {             it--;             l = (*it).first;           }           long long now = get(1, 1, n + 1, l + 1, a[v].second + 2);           now %= 1000000007ll;           update(1, 1, n + 1, a[v].second + 1, a[v].second + 2, now);         }         S.insert(make_pair(a[v].second, v));         add(1, 1, n + 1, a[v].first, a[v].second + 1, 1);         update(1, 1, n + 1, a[v].first, a[v].second + 1, 0);       }       for (int i = 0; i < B[k].size(); ++i) {         int v = B[k][i];         S.erase(make_pair(a[v].second, v));         add(1, 1, n + 1, a[v].first, a[v].second + 1, -1);       }     }     it = S.lower_bound(make_pair(n, 0));     int l = 0;     if (it != S.begin()) {       it--;       l = (*it).first;     }     long long answer = get(1, 1, n + 1, l + 1, n + 1) % 1000000007ll;     printf( %I64d n , answer);   }