func_code_string: #include <bits/stdc++.h>   using namespace std;   int x, k, n, q, cnt;   long long num[10];   int bel[1 << 10];   struct Square {     long long num[75][75];     Square() {       for (int i = 1; i <= 70; i++) {         for (int j = 1; j <= 70; j++) num[i][j] = 1e18;         num[i][i] = 0;       }     }     Square operator*(const Square &a) const {       Square tmp;       for (int i = 1; i <= cnt; i++) tmp.num[i][i] = 1e18;       for (int i = 1; i <= cnt; i++)         for (int j = 1; j <= cnt; j++)           for (int k = 1; k <= cnt; k++)             tmp.num[i][j] = tmp.num[i][j] < (num[i][k] + a.num[k][j])                                 ? tmp.num[i][j]                                 : (num[i][k] + a.num[k][j]);       return tmp;     }     Square operator^(const int &x) {       if (!x) return Square();       Square tmp, tmp1;       int times = x;       for (int i = 1; i <= cnt; i++)         for (int j = 1; j <= cnt; j++) tmp1.num[i][j] = num[i][j];       while (times) {         if (times & 1) tmp = tmp * tmp1;         times >>= 1;         tmp1 = tmp1 * tmp1;       }       return tmp;     }   } one;   struct Stone {     int place;     long long val;   } stone[30];   bool calc(int tmp) {     int many = 0;     for (int i = 1; i <= 8; i++)       if (tmp & (1 << (i - 1))) many++;     return many == x;   }   bool cmp(Stone a, Stone b) { return a.place < b.place; }   int main() {     scanf( %d%d%d%d , &x, &k, &n, &q);     for (int i = 0; i <= (1 << k) - 1; i++)       if (calc(i)) bel[i] = ++cnt;     for (int i = 1; i <= k; i++) scanf( %lld , &num[i]);     for (int i = 1; i <= q; i++) scanf( %d%lld , &stone[i].place, &stone[i].val);     sort(stone + 1, stone + q + 1, cmp);     for (int i = 1; i <= cnt; i++) one.num[i][i] = 1e18;     for (int i = 1; i <= (1 << k) - 1; i++) {       if (i & 1) {         if (!bel[i]) continue;         for (int j = 1; j <= k; j++)           if (!((1 << j) & i)) one.num[bel[i]][bel[((1 << j) | i) >> 1]] = num[j];       } else if (bel[i])         one.num[bel[i]][bel[i >> 1]] = 0;     }     int now = 1;     long long sum = 0;     Square ans;     for (int i = 1; i <= q; i++) {       if (stone[i].place > n - x) {         sum += stone[i].val;         continue;       }       ans = ans * (one ^ (stone[i].place - now)), now = stone[i].place;       for (int j = 1; j <= (1 << k) - 1; j += 2)         if (bel[j])           for (int k = 1; k <= cnt; k++) ans.num[k][bel[j]] += stone[i].val;     }     ans = ans * (one ^ (n - x + 1 - now));     printf( %lld , ans.num[1][1] + sum);   }   