func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, P, S;   int s, t;   vector<int> res1, res2;   struct node {     int to;     int cap;     int opp;     int cost;   };   vector<node> v[3500];   int d[3500];   bool in[3500];   int pre[3500], wh[3500];   void add(int x, int y, int cap, int cost) {     node tmp;     tmp.to = y;     tmp.cap = cap;     tmp.cost = cost;     tmp.opp = v[y].size();     v[x].push_back(tmp);     tmp.to = x;     tmp.cap = 0;     tmp.cost = -cost;     tmp.opp = v[x].size() - 1;     v[y].push_back(tmp);   }   bool spfa() {     memset(in, 0, sizeof(in));     for (int i = s; i <= t; i++) d[i] = -199912310;     queue<int> q;     q.push(s);     d[s] = 0;     while (!q.empty()) {       int x = q.front();       q.pop();       in[x] = false;       for (int i = 0; i < (int)v[x].size(); i++) {         if (v[x][i].cap <= 0) continue;         if (d[v[x][i].to] < d[x] + v[x][i].cost) {           d[v[x][i].to] = d[x] + v[x][i].cost;           pre[v[x][i].to] = x;           wh[v[x][i].to] = i;           if (!in[v[x][i].to]) {             in[v[x][i].to] = true;             q.push(v[x][i].to);           }         }       }     }     return d[t] != -199912310;   }   long long max_flow() {     long long ret = 0;     while (spfa()) {       int flow = 199912310;       for (int i = t; i; i = pre[i]) {         flow = min(flow, v[pre[i]][wh[i]].cap);       }       ret += 1ll * flow * d[t];       for (int i = t; i; i = pre[i]) {         v[pre[i]][wh[i]].cap -= flow;         v[i][v[pre[i]][wh[i]].opp].cap += flow;       }     }     return ret;   }   int main() {     scanf( %d , &n);     scanf( %d%d , &P, &S);     s = 0;     t = n + 3;     for (int i = 1; i <= n; i++) {       int x;       scanf( %d , &x);       add(i, n + 1, 1, x);     }     for (int i = 1; i <= n; i++) {       int x;       scanf( %d , &x);       add(i, n + 2, 1, x);       add(0, i, 1, 0);     }     add(n + 1, t, P, 0);     add(n + 2, t, S, 0);     printf( %d n , max_flow());     for (int i = 1; i <= n; i++) {       for (int j = 0; j < (int)v[i].size(); j++) {         if (v[i][j].to == n + 1 && v[i][j].cap == 0) {           res1.push_back(i);         }         if (v[i][j].to == n + 2 && v[i][j].cap == 0) {           res2.push_back(i);         }       }     }     for (int i = 0; i < (int)res1.size(); i++) printf( %I64d  , res1[i]);     puts(  );     for (int i = 0; i < (int)res2.size(); i++) printf( %d  , res2[i]);     puts(  );     return 0;   }   