#include <bits/stdc++.h>   using namespace std;   struct cub {     int c, h;   } nr[100100];   vector<int> axnorm;   vector<pair<int, int> > cul[100100];   struct cmp {     bool operator()(pair<int, int> a, pair<int, int> b) {       return (a.first > b.first);     }   };   priority_queue<pair<long long, int> > H[100100];   int N, C;   int culoare1, culoare2, nrcub1, nrcub2;   long long solutie;   int caut(int x) {     int p = -1, u = C, mij;     while (u - p > 1) {       mij = (p + u) / 2;       if (axnorm[mij] < x)         p = mij;       else         u = mij;     }     if (u == C || axnorm[u] != x) return -1;     return u;   }   void prec() {     long long sum;     for (int i = 1; i <= C; ++i) {       sum = 0;       sort(cul[i].begin(), cul[i].end(), cmp());       for (size_t j = 0; j < cul[i].size(); ++j) {         sum = (long long)(sum + cul[i][j].first);         H[(int)(j + 1)].push(pair<long long, int>(sum, i));       }     }   }   void solve() {     sort(axnorm.begin(), axnorm.end());     axnorm.erase(unique(axnorm.begin(), axnorm.end()), axnorm.end());     C = (int)axnorm.size();     int i, cc, cc1;     long long s, s1;     for (i = 1; i <= N; ++i)       cul[caut(nr[i].c) + 1].push_back(pair<int, int>(nr[i].h, i));     prec();     for (i = 1; i <= N; ++i) {       if (H[i].size() < 2) break;       s = H[i].top().first;       cc = H[i].top().second;       H[i].pop();       if (solutie < s + H[i].top().first) {         solutie = s + H[i].top().first;         culoare1 = cc;         culoare2 = H[i].top().second;         nrcub1 = nrcub2 = i;       }       H[i].push(pair<long long, int>(s, cc));     }     for (i = 2; i <= N; ++i) {       if (!H[i].size()) break;       s = H[i].top().first;       cc = H[i].top().second;       H[i].pop();       s1 = H[i - 1].top().first;       cc1 = H[i - 1].top().second;       H[i - 1].pop();       if (cc == cc1) {         if (H[i].size() > 0) {           if (solutie < s1 + H[i].top().first) {             solutie = s1 + H[i].top().first;             culoare1 = H[i].top().first;             culoare2 = cc1;             nrcub1 = i;             nrcub2 = i - 1;           }         }         if (H[i - 1].size() > 0) {           if (solutie < s + H[i - 1].top().first) {             solutie = s + H[i - 1].top().first;             culoare1 = cc1;             culoare2 = H[i - 1].top().second;             nrcub1 = i;             nrcub2 = i - 1;           }         }       } else {         if (solutie < s + s1) {           solutie = s + s1;           culoare1 = cc;           culoare2 = cc1;           nrcub1 = i;           nrcub2 = i - 1;         }       }       H[i].push(pair<long long, int>(s, cc));       H[i - 1].push(pair<long long, int>(s1, cc1));     }   }   void afis() {     size_t x, y;     x = y = 0;     cout << solutie <<   n ;     cout << nrcub1 + nrcub2 <<   n ;     while (nrcub1 || nrcub2) {       if (nrcub1 > nrcub2) {         cout << cul[culoare1][x].second <<    ;         ++x;         --nrcub1;       } else {         cout << cul[culoare2][y].second <<    ;         ++y;         --nrcub2;       }     }   }   int main() {     int i;     scanf( %d , &N);     for (i = 1; i <= N; ++i) {       scanf( %d%d , &nr[i].c, &nr[i].h);       axnorm.push_back(nr[i].c);     }     solve();     afis();     return 0;   }