#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define pb push_back

//PBDS: policy-based data structures. 包含 associative containers 和优先队列两类。
// Associative containers are typically parameterized by various policies.
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;

using order_statistic_tree = __gnu_pbds::tree<
        long long,
        __gnu_pbds::null_type,
        less_equal<long long>,
        __gnu_pbds::rb_tree_tag,
        __gnu_pbds::tree_order_statistics_node_update>;



using ll = long long;
using ull = unsigned long long;
using ul = unsigned long;


template<typename T>
void print(const T &t, const char &eol = '\n') {
    cout << t << eol;
}

template<typename T, typename ...Args>
void print(const T &t, const Args &...rest) {
    cout << t << ' ';
    print(rest...);
}


using PII=pair<int,int>;


namespace hungary {
    const int N = 105;
    bool vis[N];
    int match[N];
    int n;
    bool e[N][N];
    bool dfs(int u) {
        for (int v = 1; v <= n; v++) {
            if(!e[u][v]) continue;
            if (vis[v]) continue;
            vis[v] = true;
            if (!match[v] || dfs(match[v])) {
                match[v] = u;
                return true;
            }
        }
        return false;
    }

    int hungary(int n) {
        memset(match, 0, sizeof(match));
        int res = 0;
        for (int i = 1; i <= n; i++) {
            memset(vis, 0, sizeof(vis));
            res += dfs(i);
        }
        return res;
    }
}

const int N = 200000+5;


vector<pair<int,int>> a, b;
bool used[N];

int main() {
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
//////////////////////////////////////////////////////
// 为何我的代码写得如此啰嗦？
    int n;
    cin >> n;
    for(int i=1; i<=n; i++){
        int x;
        cin >> x;
        if(i%2)
            a.push_back({x, i});
        else b.push_back({x, i});
    }
    sort(a.begin(), a.end(), greater<pair<int,int>>());
    sort(all(b), greater<pair<int,int>>());

    long long s1 =0, s2 = 0;
    int na = 0, nb = 0;
    auto use=[](const pair<int,int> &x, long long &s, int &cnt){
        s+=x.first;
        used[x.second]=true;
        ++cnt;
    };

    for(auto &x: a){
        if(x.first>0){
            use(x, s1, na);
        }
        else break;
    }
    for(auto &x: b){
        if(x.first>0){
            use(x, s2, nb);
        }
        else break;
    }
    if(s1 == 0){
        use(a.front(), s1, na);
    }
    if(s2 == 0){
       use(b.front(), s2, nb);
    }

    int tmp = s2 > s1;
    while(tmp <= n) {
        used[tmp]=false;
        tmp += 2;
    }

    print(max(s1, s2));
    

    int l=1;
    while(l<=n && !used[l]){
        ++l;
        // print(1);
    }


    int r = n;
    while(r>=1 && !used[r]){
        --r;
    }

    print(n-(r-l+1)+(r-l)/2);
    for(int i=1; i<l; i++) print(1);
    for(int i=0; i<n-r; i++) print(n-l+1-i);
    
    
    int i = l;
    while(i<=r){
        if(used[i]){
            i++;
        }
        else if(!used[i+1]){
            print(3);
            i+=2;
        }
        else{
            print(2);
            i+=2;
        }
    }
    return 0;
}

Measured memory_bytes: 256