Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7.  
  8. vector<pair<long long, long long>> t;
  9. const long long MOD = 1000 * 1000 * 1000 + 7;
  10. void recalc(long long v)
  11. {
  12. if(t[v * 2].first > t[v * 2 + 1].first)
  13. {
  14. t[v] = t[v * 2];
  15. }
  16. else if(t[v * 2].first < t[v * 2 + 1].first)
  17. {
  18. t[v] = t[v * 2 + 1];
  19. }
  20. else
  21. {
  22. t[v] = {t[v * 2].first, t[v * 2].second + t[v * 2 + 1].second};
  23. }
  24. t[v].first %= MOD;
  25. t[v].second %= MOD;
  26. }
  27.  
  28.  
  29. void upd(long long v, long long l, long long r, long long L, long long R, pair<long long, long long> x)
  30. {
  31. if(l >= R || L >= r)
  32. {
  33. return;
  34. }
  35. if(L <= l && r <= R)
  36. {
  37. if(t[v].first < x.first)
  38. {
  39. t[v] = x;
  40. }
  41. else if(t[v].first == x.first)
  42. {
  43. t[v].second += x.second;
  44. }
  45. t[v].second %= MOD;
  46. return;
  47. }
  48. upd(v * 2, l, (l + r) / 2, L, R, x);
  49. upd(v * 2 + 1, (l + r) / 2, r, L, R, x);
  50. recalc(v);
  51. }
  52.  
  53. pair<long long, long long> get(long long v, long long l, long long r, long long L, long long R)
  54. {
  55. if(l >= R || L >= r)
  56. {
  57. return {0, 0};
  58. }
  59. if(L <= l && r <= R)
  60. {
  61. return t[v];
  62. }
  63. auto x1 = get(v * 2, l, (l + r) / 2, L, R);
  64. auto x2 = get(v * 2 + 1, (l + r) / 2, r, L, R);
  65. if(x1.first > x2.first)
  66. {
  67. return {x1.first % MOD, x1.second % MOD};
  68. }
  69. if(x1.first < x2.first)
  70. {
  71. return x2;
  72. }
  73. else
  74. {
  75. return {x1.first, (x1.second + x2.second) % MOD};
  76. }
  77. }
  78.  
  79.  
  80. signed main()
  81. {
  82. freopen("input.txt", "r", stdin);
  83. freopen("output.txt", "w", stdout);
  84. long long n;
  85. cin >> n;
  86. t.resize(4 * n);
  87. vector<long long> v(n);
  88. for(long long i = 0; i < n; ++i)
  89. {
  90. cin >> v[i];
  91. }
  92. auto p = v;
  93. sort(p.begin(), p.end());
  94. p.erase(unique(p.begin(), p.end()), p.end());
  95. for(long long i = 0; i < n; ++i)
  96. {
  97. long long x = v[i];
  98. long long pos = lower_bound(p.begin(), p.end(), x) - p.begin();
  99. ++pos;
  100. auto get1 = get(1, 0, n, 0, pos - 1);
  101. upd(1, 0, n, pos - 1, pos, {get1.first + 1, max(get1.second, 1LL)});
  102. }
  103. cout << get(1, 0, n, 0, n).second;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement