#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimization("unroll-loops")
std::pair<int, int> DR[] = {{-1, 0}, {0, 1},   {1, 0}, {0, -1},
                            {-1, 1}, {-1, -1}, {1, 1}, {1, -1}};
using namespace std;
const long long mod = 1e9 + 7;
long long nop = 100;
vector<long long> primes;
void sieve() {
  primes[1] = primes[0] = 0;
  for (long long i = 2; i * i <= nop; i++) {
    if (primes[i]) {
      for (long long j = i * i; j <= nop; j += i) {
        primes[j] = 0;
      }
    }
  }
}
long long gcd(long long a, long long b) {
  if (b > a) swap(b, a);
  if (b == 0) return a;
  return gcd(b, a % b);
}
void extgcd(long long a, long long b, long long& x, long long& y) {
  if (a == 0) {
    x = a;
    y = b;
    return;
  }
  extgcd(b % a, a, x, y);
  long long y1 = y, x1 = x;
  x = y1 - (b / a) * x1;
  y = x1;
}
long long lcm(long long a, long long b) { return (a * b) / gcd(a, b); }
long long bexp(long long num, long long e) {
  long long ans = 1;
  while (e > 0) {
    if (e & 1) {
      ans *= num;
    }
    num *= num;
    e >>= 1;
  }
  return ans;
}
long long mexp(long long num, long long e) {
  long long ans = 1;
  while (e > 0) {
    if (e & 1) {
      ans = (ans * num) % mod;
    }
    num *= num;
    num %= mod;
    e >>= 1;
  }
  return ans % mod;
}
long long modinv(long long a) { return mexp(a, mod - 2); }
int main() {
  cin.tie(0);
  cout.tie(0);
  ios::sync_with_stdio(0);
  long long n, m, k, t;
  cin >> m >> n >> k >> t;
  vector<long long> a(m);
  for (long long i = 0; i < m; i++) {
    cin >> a[i];
  };
  sort(a.begin(), a.end(), greater<long long>());
  vector<long long> mini(m, 0x3f3f3f3f3f3f3ff);
  mini[0] = a[0];
  for (long long i = 1; i <= m - 1; i++) {
    mini[i] = min(mini[i - 1], a[i]);
  }
  vector<pair<long long, pair<long long, long long> > > trap(k);
  for (long long i = 0; i < k; i++) {
    cin >> trap[i].second.first >> trap[i].second.second >> trap[i].first;
  }
  sort(trap.begin(), trap.end());
  long long l = 0, r = m;
  while (l < r) {
    long long mid = ceil((l + r) / 2.0);
    long long tim = n + 1;
    if (!mid)
      tim = n + 1;
    else {
      long long i = 0;
      while (i < k && trap[i].first <= mini[mid - 1]) i++;
      if (i == k)
        tim = n + 1;
      else {
        long long sum = 0, mr = 0;
        vector<pair<long long, long long> > p;
        while (i < k) {
          p.push_back({trap[i].second.first, trap[i].second.second});
          i++;
        }
        sort(p.begin(), p.end());
        for (auto e : p) {
          if (e.second <= mr) {
            continue;
          }
          if (mr < e.first) mr = e.first - 1;
          sum += (e.second - mr);
          mr = e.second;
        }
        tim = n + 1 + 2 * (sum);
      }
    }
    if (tim <= t) {
      l = mid;
    } else
      r = mid - 1;
  }
  cout << l << endl;
  return 0;
}
