func_code_string: #include <bits/stdc++.h>   using namespace std;   using matrix = vector<vector<long long>>;   int main() {     ios_base::sync_with_stdio(false);     cin.tie(nullptr);     int x, l, n, q;     cin >> x >> l >> n >> q;     int log_n = 0;     while ((1 << log_n) <= n) {       ++log_n;     }     vector<int> c(l + 1);     for (int i = 1; i <= l; ++i) {       cin >> c[i];     }     map<int, int> stones;     vector<int> stops = {n - x};     for (int i = 0; i < q; ++i) {       int p, w;       cin >> p >> w;       stones[p] = w;       for (int j = 1; j <= l; ++j) {         stops.push_back(p - j);       }     }     sort(stops.begin(), stops.end());     while (stops.back() > n - x) {       stops.pop_back();     }     vector<matrix> pow_matrix(log_n);     pow_matrix[0].assign(1 << l, vector<long long>(1 << l, LLONG_MAX / 2));     for (int i = 0; i < (1 << l); ++i) {       if ((i & 1) == 0) {         pow_matrix[0][i][i >> 1] = 0;       } else {         for (int j = 1; j <= l; ++j) {           if ((i & (1 << j)) == 0) {             pow_matrix[0][i][(i ^ (1 << j)) >> 1] = c[j];           }         }       }     }     auto mul = [](const matrix& a, const matrix& b) -> matrix {       int n = a.size();       matrix c(n, vector<long long>(n, LLONG_MAX / 2));       for (int i = 0; i < n; ++i) {         for (int j = 0; j < n; ++j) {           for (int k = 0; k < n; ++k) {             c[i][k] = min(c[i][k], a[i][j] + b[j][k]);           }         }       }       return c;     };     for (int i = 1; i < log_n; ++i) {       pow_matrix[i] = mul(pow_matrix[i - 1], pow_matrix[i - 1]);     }     auto mul_vector = [](const matrix& a,                          const vector<long long>& b) -> vector<long long> {       int n = a.size();       vector<long long> c(n, LLONG_MAX / 2);       for (int i = 0; i < n; ++i) {         for (int j = 0; j < n; ++j) {           c[j] = min(c[j], a[i][j] + b[i]);         }       }       return c;     };     vector<long long> dp(1 << l, LLONG_MAX / 2);     dp[(1 << x) - 1] = 0;     int pos = 1;     for (auto i : stops) {       if (i < pos) {         continue;       }       for (int j = log_n - 1; j >= 0; --j) {         if (pos + (1 << j) <= i) {           dp = mul_vector(pow_matrix[j], dp);           pos += 1 << j;         }       }       vector<long long> dp_new(1 << l, LLONG_MAX / 2);       for (int j = 0; j < (1 << l); ++j) {         if ((j & 1) == 0) {           dp_new[j >> 1] = min(dp_new[j >> 1], dp[j]);         } else {           for (int k = 1; k <= l; ++k) {             if ((j & (1 << k)) == 0) {               long long cost = dp[j] + c[k];               if (stones.count(pos + k)) {                 cost += stones[pos + k];               }               int mask = (j ^ (1 << k)) >> 1;               dp_new[mask] = min(dp_new[mask], cost);             }           }         }       }       dp = dp_new;       ++pos;     }     cout << dp[(1 << x) - 1] <<   n ;   }   