fork download
  1. #include <bits/stdc++.h>
  2. #define fio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
  3. #define fo(i,a,b,c) for(int i = a ; i<=b ; i+=c)
  4. #define fol(i,a,b,c) for(int i = a ; i>=b ; i-=c)
  5. #define pii pair<int,int>
  6. #define fi first
  7. #define se second
  8. #define pb push_back
  9. #define ins insert
  10. #define pow(z) (1LL*(z)*(z))
  11. #define M 1000000007
  12.  
  13. using namespace std;
  14.  
  15. int n, k, p[200005];
  16. pii w[11];
  17. long long t[800005];
  18.  
  19. void up(int i, int l, int r, int pos, int val){
  20. if(l == r){ t[i] = val; return; }
  21. int m = (l + r) / 2;
  22. if(pos <= m)up(i * 2, l, m, pos, val);
  23. else up(i * 2 + 1, m + 1, r, pos, val);
  24. t[i] = (t[i * 2]%M + t[i * 2 + 1]%M)%M;
  25. }
  26.  
  27. long long sum(int i, int l, int r, int x, int y){
  28. if(l > y || r < x) return 0;
  29. if(x <= l && r <= y) return t[i];
  30. int m = (l + r) / 2;
  31. return (sum(i * 2, l, m, x, y)%M + sum(i * 2 + 1, m + 1, r, x, y)%M)%M;
  32. }
  33.  
  34. int main(){
  35. fio;
  36. // freopen("ucute.inp","r",stdin);
  37. // freopen("ucute.out","w",stdout);
  38.  
  39. cin >> n >> k;
  40. fo(i, 1, k, 1) cin >> w[i].fi >> w[i].se;
  41. sort(w+1,w+k+1);
  42. p[1] = 1;
  43. up(1, 1, n, 1, 1);
  44. fo(i, 2, n, 1){
  45. int last = w[1].fi;
  46. fo(j, 1, k, 1){
  47. int l = max(last, w[j].fi);
  48. int r = min(i - 1, w[j].se);
  49. if(l >= i || l > r) continue;
  50. p[i] = ((p[i]%M) + sum(1, 1, n, i - r, i - l))%M;
  51. last = r + 1;
  52. }
  53. up(1, 1, n, i, p[i]);
  54. }
  55. cout << p[n];
  56. }
  57.  
Success #stdin #stdout 0.01s 5592KB
stdin
5 2
1 1
3 5
stdout
4