func_code_string: #include <bits/stdc++.h>   using namespace std;   int N, S, M, K;   int A[2020], B[2020];   int L[2020], R[2020];   vector<int> V;   int MR[2020];   int dp[1600][1600];   int ok(int v) {     int i, j;     for (i = 0; i < (N); i++) B[i + 1] = B[i] + (A[i] <= v);     memset(dp, 0, sizeof(dp));     for (i = 0; i < (N); i++) {       for (j = 0; j < (M); j++) {         if (MR[i] > i) {           dp[MR[i]][j + 1] = max(dp[MR[i]][j + 1], dp[i][j] + B[MR[i]] - B[i]);           if (dp[MR[i]][j + 1] >= K) return 1;         }         dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]);       }     }     return 0;   }   void solve() {     int i, j, k, l, r, x, y;     string s;     cin >> N >> S >> M >> K;     for (i = 0; i < (N); i++) {       cin >> A[i];       V.push_back(A[i]);     }     for (i = 0; i < (S); i++) {       cin >> L[i] >> R[i];       for (j = L[i] - 1; j < R[i]; j++) MR[j] = max(MR[j], R[i]);     }     sort((V.begin()), (V.end()));     V.erase(unique((V.begin()), (V.end())), V.end());     if (ok(V.back()) == 0) return (void)printf( -1 n );     int ret = V.size() - 1;     for (i = 12; i >= 0; i--) {       if (ret >= (1 << i) && ok(V[ret - (1 << i)])) ret -= 1 << i;     }     cout << V[ret] << endl;   }   int main(int argc, char** argv) {     string s;     int i;     if (argc == 1) ios::sync_with_stdio(false), cin.tie(0);     for (i = 0; i < (argc - 1); i++) s += argv[i + 1], s +=   n ;     for (i = 0; i < (s.size()); i++) ungetc(s[s.size() - 1 - i], stdin);     cout.tie(0);     solve();     return 0;   }   