Advertisement
Guest User

Untitled

a guest
Mar 17th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define F first
  4. #define S second
  5. #define pb push_back
  6. #define ll long long
  7.  
  8. using namespace std;
  9.  
  10. vector < int > d1, d2;
  11. vector < pair < int, int > > mem;
  12. int st = 0;
  13.  
  14. int find_max(int v, int l, int r, int cl, int cr) {
  15. if (cl >= r || cr <= l) return -1e9;
  16. if (cl >= l && cr <= r) return d1[v];
  17. int mid = (cl + cr) / 2;
  18. return max(find_max(v * 2, l, r, cl, mid), find_max(v * 2 + 1, l, r, mid, cr));
  19. }
  20.  
  21. int find_min(int v, int l, int r, int cl, int cr) {
  22. if (cl >= r || cr <= l) return 1e9;
  23. if (cl >= l && cr <= r) return d2[v];
  24. int mid = (cl + cr) / 2;
  25. return min(find_min(v * 2, l, r, cl, mid), find_min(v * 2 + 1, l, r, mid, cr));
  26. }
  27.  
  28. pair < int, int > kek(int v, int l, int r, int cl, int cr) {
  29. if (cl >= r || cr <= l) return {1e9, 0};
  30. if (cl >= l && cr <= r) return mem[v];
  31. int mid = (cl + cr) / 2;
  32. pair < int, int > zn1 = kek(v * 2, l, r, cl, mid), zn2 = kek(v * 2 + 1, l, r, mid, cr);
  33. if (zn1.F < zn2.F) return zn1;
  34. return zn2;
  35. }
  36.  
  37. void upd(int v) {
  38. v += (1 << st);
  39. v /= 2;
  40. while (v > 0) {
  41. if (mem[v * 2].F < mem[v * 2 + 1].F) mem[v].S = mem[v * 2].S;
  42. else mem[v].S = mem[v * 2 + 1].S;
  43. mem[v].F = min(mem[v * 2].F, mem[v * 2 + 1].F);
  44. v /= 2;
  45. }
  46. }
  47.  
  48. int main() {
  49. ios_base::sync_with_stdio(0);
  50. cin.tie(0);
  51. cout.tie(0);
  52. #ifdef LOCAL
  53. freopen("input.txt","r",stdin);
  54. freopen("output.txt","w",stdout);
  55. #else
  56. // freopen("input.txt","r",stdin);
  57. // freopen("output.txt","w",stdout);
  58. #endif
  59. //YA IZVINYAUS
  60. int n, s, l;
  61. cin >> n >> s >> l;
  62. while (1 << st < n)
  63. ++st;
  64. d1.resize(1 << (st + 1), -1e9);
  65. d2.resize(1 << (st + 1), 1e9);
  66. mem.resize(1 << (st + 1), {1e9, 0});
  67. vector < int > f(n, 0);
  68. int a[n];
  69. for (int i = 0; i < n; ++i) {
  70. cin >> a[i];
  71. d1[(1 << st) + i] = a[i];
  72. d2[(1 << st) + i] = a[i];
  73. }
  74. for (int i = (1 << st) - 1; i > 0; --i) {
  75. d1[i] = max(d1[i * 2], d1[i * 2 + 1]);
  76. d2[i] = min(d2[i * 2], d2[i * 2 + 1]);
  77. }
  78. for (int i = 0; i < n; ++i) {
  79. if (i > 0) f[i] = f[i - 1];
  80. while (find_max(1, f[i], i + 1, 0, 1 << st) - find_min(1, f[i], i + 1, 0, 1 << st) > s)
  81. ++f[i];
  82. }
  83. vector < int > dp(n, 1e9);
  84. for (int i = 0; i < n; ++i) {
  85. int l = f[i], r = i - l;
  86. if (f[i] == 0) {
  87. dp[i] = 1;
  88. upd(i);
  89. continue;
  90. }
  91. r = max(r, 0);
  92. if (l > r) swap(l, r);
  93. int j = kek(1, l, r + 1, 0, 1 << st).S;
  94. dp[i] = dp[j] + 1;
  95. }
  96. for (int i = 0; i < n; ++i)
  97. cout << dp[i] << ' ';
  98. return 0;
  99. if (dp[n - 1] >= 1e9) dp[n - 1] = -1;
  100. cout << dp[n - 1];
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement