func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MN = 70;   struct mat {     long long T[MN][MN];     void O() {       for (int i = 0; i < MN; i++)         for (int j = 0; j < MN; j++) T[i][j] = 1e18;     }   };   mat mult(mat a, mat b) {     mat ret;     ret.O();     for (int i = 0; i < MN; i++) {       for (int j = 0; j < MN; j++) {         for (int k = 0; k < MN; k++) {           ret.T[i][j] = min(ret.T[i][j], a.T[i][k] + b.T[k][j]);         }       }     }     return ret;   }   mat exp(mat x, int n) {     mat ret;     ret.O();     for (int i = 0; i < MN; i++) ret.T[i][i] = 0;     while (n) {       if (n & 1) ret = mult(ret, x);       x = mult(x, x);       n >>= 1;     }     return ret;   }   int X, K, N, Q;   int C[10];   pair<int, int> W[30];   map<int, int> chk;   vector<int> Mask;   int inv[256];   mat P, Y, A;   int main() {     scanf( %d %d %d %d , &X, &K, &N, &Q);     for (int i = 1; i <= K; i++) {       scanf( %d , &C[i]);     }     for (int i = 0; i < Q; i++) {       scanf( %d %d , &W[i].first, &W[i].second);       W[i].first--;       chk[W[i].first] = W[i].second;     }     sort(W, W + Q);     for (int i = 0; i < (1 << K); i++) {       int cnt = 0;       for (int j = 0; j < K; j++)         if (i & (1 << j)) cnt++;       if (cnt == X) Mask.push_back(i);     }     for (int i = 0; i < Mask.size(); i++) inv[Mask[i]] = i;     A.O();     A.T[0][0] = 0;     P.O();     for (int i = 0; i < Mask.size(); i++) {       int mask = Mask[i];       if (!(mask & 1)) {         P.T[i][inv[mask >> 1]] = 0;         continue;       }       for (int j = 1; j <= K; j++) {         if (mask & (1 << j)) continue;         int mask2 = mask ^ (1 << j);         mask2 >>= 1;         P.T[i][inv[mask2]] = C[j];       }     }     int cur_len = X;     for (int q = Q - 1; q >= 0; q--) {       int len = N - W[q].first;       if (len > cur_len) {         A = mult(exp(P, len - cur_len), A);         cur_len = len;       }       while (cur_len < N - W[q].first + K && cur_len < N) {         int p = N - cur_len - 1;         Y.O();         for (int i = 0; i < Mask.size(); i++) {           int mask = Mask[i];           if (!(mask & 1)) {             Y.T[i][inv[mask >> 1]] = 0;             continue;           }           for (int j = 1; j <= K; j++) {             if (mask & (1 << j)) continue;             int mask2 = mask ^ (1 << j);             mask2 >>= 1;             Y.T[i][inv[mask2]] =                 C[j] + (chk.find(p + j) != chk.end() ? chk[p + j] : 0);           }         }         A = mult(Y, A);         cur_len++;       }     }     if (N > cur_len) {       A = mult(exp(P, N - cur_len), A);     }     printf( %lld , A.T[inv[(1 << X) - 1]][0]);   }   