func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 1e5 + 10;   const int p = 1e9 + 7;   struct edge {     int l, r, uk;   };   edge a[MAXN];   int dp[4 * MAXN];   int b[MAXN];   int n, m;   void update(int k) {     dp[k] = (dp[k * 2] + dp[k * 2 + 1]) % p;     if (k > 1) update(k / 2);   }   long long getsum(int v, int ll, int rr, int l, int r) {     if (ll > r || rr < l) return 0;     if (ll >= l && rr <= r) return dp[v];     return (getsum(v * 2, ll, (ll + rr) / 2, l, r) +             getsum(v * 2 + 1, (ll + rr) / 2 + 1, rr, l, r)) %            p;   }   bool operator<(edge a, edge b) { return a.r < b.r; }   int binr(int l, int r, int q) {     while (l < r - 1) {       if (b[(l + r) / 2] < q)         l = (l + r) / 2;       else         r = (l + r) / 2;     }     return r;   }   int main() {     int i, size = 1, uk, l;     cin >> n >> m;     while (size < m) {       size *= 2;     }     for (i = 0; i < m; i++) {       cin >> a[i].l >> a[i].r;     }     sort(a, a + m);     b[0] = 0;     b[1] = a[0].r;     uk = 2;     for (i = 1; i < m; i++) {       if (a[i - 1].r != a[i].r) {         b[uk] = a[i].r;         uk++;       }       a[i].uk = uk;     }     dp[size] = 1;     update(size / 2);     int uk1 = 1;     for (i = 0; i < m; i++) {       l = binr(-1, uk - 1, a[i].l);       l++;       if (i != 0 && a[i - 1].r != a[i].r) uk1++;       dp[size + uk1] = (dp[size + uk1] + getsum(1, 1, size, l, uk1)) % p;       update((size + uk1) / 2);     }     uk--;     if (a[m - 1].r != n)       cout << 0;     else       cout << dp[size + uk1];     return 0;   }   