1 #pragma warning(disable:4996)
2
3 #include<iostream>
4 #include<string>
5 #include<queue>
6 #include<stack>
7 #include<vector>
8 #include<map>
9 #include<cstdio>
10 #include<cstdlib>
11 #include<algorithm>
12 #include<set>
13 #include<list>
14 #include<iomanip>
15 #include<cstring>
16 #include<cmath>
17 #include<limits>
18 using namespace std;
19
20 #define au auto
21 #define debug(i) cout<<"<debug> "<<i<<" <\debug>"<<endl
22 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
23 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
24 #define LLL __int128
25 #define Re register
26 #define il inline
27 #define mem(a,b) memset(a,(b),sizeof(a))
28 #define Design ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
29 typedef pair<int, int> intpair;
30 typedef pair<long long int, long long int> llpair;
31 typedef long long int LL;
32 const int INF = 0x3f3f3f3f;
33 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
34
35 const int maxn = 200010;
36 int sol[maxn];
37 int m, n, k, t;
38
39 struct trap
40 {
41 int l, r;
42 int d;
43 trap() :l(0), r(0), d(0) {}
44 trap(int a, int b, int c) :l(a), r(b), d(c) {}
45 bool operator <(trap s)const
46 {
47 return d < s.d;
48 }
49 }tr[maxn];
50
51 bool cmp(trap a, trap b)
52 {
53 if (a.l == b.l) return a.r < b.r;
54 return a.l < b.l;
55 }
56
57 bool check(int x)
58 {
59 //debug("x: " << x << " sol[x]: " << sol[x]);
60 if (tr[k].d <= sol[x]) return true;
61 int low = 1;
62 int high = k;
63 while (low < high)
64 {
65 int mid = (low + high) >> 1;
66 if (tr[mid].d <= sol[x]) low = mid + 1;
67 else high = mid;
68 }
69 //debug("low: " << low);
70 vector<trap>temp;
71 mfor(i, low, k) temp.push_back(tr[i]);
72 sort(temp.begin(), temp.end(), cmp);
73 vector<intpair>res;
74 int l, r;
75 l = temp[0].l;
76 r = temp[0].r;
77 mfor(i, 1, temp.size() - 1)
78 {
79 if (temp[i].l <= r)
80 {
81 r = max(r, temp[i].r);
82 }
83 else
84 {
85 res.push_back(intpair(l, r));
86 l = temp[i].l;
87 r = temp[i].r;
88 }
89 }
90 res.push_back(intpair(l, r));
91 int sum = 0;
92 for (auto it : res)
93 {
94 sum += it.second - it.first + 1;
95 }
96 //debug("sum: " << sum);
97 return (sum << 1) + n < t;
98 }
99
100 int main()
101 {
102 Design;
103 cin >> m >> n >> k >> t;
104 mfor(i, 1, m) cin >> sol[i];
105 sort(sol + 1, sol + 1 + m);
106 mfor(i, 1, k) cin >> tr[i].l >> tr[i].r >> tr[i].d;
107 sort(tr + 1, tr + 1 + k);
108 int l = 1;
109 int r = m;
110 while (l < r)
111 {
112 int mid = (l + r) >> 1;
113 if (!check(mid)) l = mid + 1;
114 else r = mid;
115 }
116 if (check(l)) cout << m - l + 1;
117 else cout << m - l;
118 }