Advertisement
cincout

Untitled

Nov 27th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <unordered_set>
  10. #include <unordered_map>
  11. #include <queue>
  12. #include <ctime>
  13. #include <cassert>
  14. #include <complex>
  15. #include <numeric>
  16. #include <string>
  17. #include <cstring>
  18. #include <chrono>
  19. #include <random>
  20. #include <queue>
  21. #include <bitset>
  22. using namespace std;
  23.  
  24. typedef long long ll;
  25. typedef pair<int, int> pii;
  26. typedef pair<ll, int> pli;
  27. typedef pair<ll, ll> pll;
  28. typedef long double ld;
  29. #define mp make_pair
  30. #define str(a) a.c_str()
  31.  
  32. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  33.  
  34. const int N = 3e5;
  35. int n, m, k, t;
  36. int a[N];
  37.  
  38. vector<pii> lb[N];
  39. vector<int> suff[N];
  40.  
  41. int main() {
  42. ios::sync_with_stdio(false);
  43. // freopen("input.txt", "r", stdin);
  44. // freopen("output.txt", "w", stdout);
  45.  
  46. int m, n, k, t;
  47. cin >> m >> n >> k >> t;
  48.  
  49. for (int i = 0; i < m; ++i) {
  50. cin >> a[i];
  51. }
  52. sort(a, a + m);
  53. reverse(a, a + m);
  54.  
  55. for (int i = 0; i < k; ++i) {
  56. int l, r, d;
  57. cin >> l >> r >> d;
  58. lb[l].push_back(mp(d, r));
  59. }
  60.  
  61. for (int i = 0; i <= n + 1; ++i) {
  62. sort(lb[i].begin(), lb[i].end());
  63. suff[i].resize(lb[i].size());
  64. for (int j = lb[i].size() - 1; j > -1; --j) {
  65. suff[i][j] = lb[i][j].second;
  66. if (j + 1 < lb[i].size()) suff[i][j] = max(suff[i][j], suff[i][j + 1]);
  67. }
  68. }
  69.  
  70. int lo = 0, hi = m + 1;
  71.  
  72. while (hi - lo > 1) {
  73. int mid = (lo + hi) / 2;
  74. int worst = a[mid - 1];
  75. int have = 0, mxwas = 0;
  76. for (int i = 0; i <= n + 1; ++i) {
  77. int l = -1, r = lb[i].size();
  78. while (r - l > 1) {
  79. int mid = (l + r) / 2;
  80. if (lb[i][mid].first <= worst) {
  81. l = mid;
  82. }
  83. else {
  84. r = mid;
  85. }
  86. }
  87. l++;
  88. if (l < lb[i].size()) {
  89. mxwas = max(mxwas, suff[i][l]);
  90. }
  91. }
  92. have = mxwas * 2 + n + 1;
  93. if (have <= t) {
  94. lo = mid;
  95. }
  96. else {
  97. hi = mid;
  98. }
  99. }
  100.  
  101. cout << lo << "\n";
  102.  
  103. return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement