func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long int dx[] = {0, 1, -1, 0, 1, -1, -1, 1};   const long long int dy[] = {-1, 0, 0, 1, 1, 1, -1, -1};   long long int gcd(long long int x, long long int y) {     return (y != 0 ? gcd(y, x % y) : x);   }   long long int lcm(long long int x, long long int y) {     return (x / gcd(x, y) * y);   }   struct edge {     int viz;     int cap;     int cost;     int dual;     edge() {}     edge(int viz, int cap, int cost, int dual)         : viz(viz), cap(cap), cost(cost), dual(dual) {}   };   int pro[3054];   int spo[3054];   vector<edge> g[3054];   int d[3054];   int p[3054];   int p_edge[3054];   int color[3054];   int flow;   int fcost;   void add_edge(int x, int y, int cap, int cost) {     g[x].push_back(edge(y, cap, cost, (int)g[y].size()));     g[y].push_back(edge(x, 0, -cost, (int)g[x].size() - 1));   }   int SPFA(int s, int t) {     queue<int> fila;     for (int i = 0; i <= t; i++) {       d[i] = 1000000000;       color[i] = 0;     }     d[s] = 0;     fila.push(s);     while (!fila.empty()) {       int next = fila.front();       color[next] = 0;       fila.pop();       for (int i = 0; i < (int)g[next].size(); i++) {         int viz = g[next][i].viz;         int cap = g[next][i].cap;         int cost = d[next] + g[next][i].cost;         if (cap > 0 && d[viz] > cost) {           d[viz] = cost;           p_edge[viz] = i;           p[viz] = next;           if (color[viz] == 0) {             fila.push(viz);             color[viz] = 1;           }         }       }     }     return d[t] != 1000000000;   }   void mcmf(int s, int t) {     while (SPFA(s, t)) {       int augment = 1000000000;       for (int v = t; v != s; v = p[v]) {         int idx = p_edge[v];         augment = min(augment, g[p[v]][idx].cap);       }       for (int v = t; v != s; v = p[v]) {         int idx = p_edge[v];         int dual = g[p[v]][idx].dual;         g[p[v]][idx].cap -= augment;         g[v][dual].cap += augment;       }       flow += augment;       fcost += d[t] * augment;     }     return;   }   int main(void) {     int src = 3054 - 1;     int sink = 3054 - 2;     int sports = 3054 - 3;     int programming = 3054 - 4;     int n, pp, ss;     cin >> n >> pp >> ss;     for (int i = 0; i < n; i++) {       add_edge(src, i, 1, 0);       cin >> pro[i];       add_edge(i, programming, 1, -pro[i]);     }     for (int i = 0; i < n; i++) {       cin >> spo[i];       add_edge(i, sports, 1, -spo[i]);     }     add_edge(programming, sink, pp, 0);     add_edge(sports, sink, ss, 0);     mcmf(src, sink);     cout << -fcost << endl;     vector<int> saida1, saida2;     for (int i = 0; i < n; i++) {       if (g[i][1].cap == 0) {         saida1.push_back(i + 1);       }       if (g[i][2].cap == 0) {         saida2.push_back(i + 1);       }     }     for (int i = 0; i < saida1.size(); i++) {       cout << saida1[i] <<    ;     }     cout << endl;     for (int i = 0; i < saida2.size(); i++) {       cout << saida2[i] <<    ;     }     cout << endl;     return 0;   }   