#include <bits/stdc++.h>   using namespace std;   template <class T>   void clear(T &x) {     T t;     x.swap(t);   }   template <class T>   void miz(T &a, T b) {     if (b < a) a = b;   }   template <class T>   void maz(T &a, T b) {     if (b > a) a = b;   }   template <class T>   T gcd(T a, T b) {     while (b) {       a %= b;       swap(a, b);     }     return a;   }   struct Shoe {     int p, i;     Shoe() {}     Shoe(int p, int i) : p(p), i(i) {}   };   struct Customer {     int m, f, i;     bool operator<(const Customer &q) const { return f < q.f; }   };   const int CMAX = 100000;   map<int, Shoe> bst;   int C;   Customer cus[CMAX];   Shoe sa[CMAX], sb[CMAX];   long long dp[CMAX][2][2];   int pd[CMAX][2][2];   void MAZ(int i, int j, int k, long long v1, int v2) {     if (v1 > dp[i][j][k]) {       dp[i][j][k] = v1;       pd[i][j][k] = v2;     }   }   void solve() {     int i, j, k;     long long x;     for (i = C - 1; i >= 0; i--) {       for (j = 0; j < 2; j++) {         for (k = 0; k < 2; k++) {           if (i != C - 1) {             if (cus[i + 1].f == cus[i].f) {               dp[i][j][k] = dp[i + 1][j][k];             } else if (cus[i + 1].f == cus[i].f + 1) {               dp[i][j][k] = dp[i + 1][k][0];             } else {               dp[i][j][k] = dp[i + 1][0][0];             }           }           if (!j && cus[i].m >= sa[i].p) {             if (i == C - 1) {               x = 0;             } else if (cus[i + 1].f == cus[i].f) {               x = dp[i + 1][1][k];             } else if (cus[i + 1].f == cus[i].f + 1) {               x = dp[i + 1][k][0];             } else {               x = dp[i + 1][0][0];             }             MAZ(i, j, k, sa[i].p + x, 1);           }           if (!k && cus[i].m >= sb[i].p) {             if (i == C - 1) {               x = 0;             } else if (cus[i + 1].f == cus[i].f) {               x = dp[i + 1][j][1];             } else if (cus[i + 1].f == cus[i].f + 1) {               x = dp[i + 1][1][0];             } else {               x = dp[i + 1][0][0];             }             MAZ(i, j, k, sb[i].p + x, 2);           }         }       }     }     printf( %I64d n , dp[0][0][0]);     vector<pair<int, int> > ans;     i = 0;     j = 0;     k = 0;     while (1) {       if (pd[i][j][k] == 0) {         if (i == C - 1) {           break;         } else if (cus[i + 1].f == cus[i].f) {           i++;         } else if (cus[i + 1].f == cus[i].f + 1) {           i++;           j = k;           k = 0;         } else {           i++;           j = 0;           k = 0;         }       } else if (pd[i][j][k] == 1) {         ans.push_back(make_pair(cus[i].i, sa[i].i));         if (i == C - 1) {           break;         } else if (cus[i + 1].f == cus[i].f) {           i++;           j = 1;         } else if (cus[i + 1].f == cus[i].f + 1) {           i++;           j = k;           k = 0;         } else {           i++;           j = 0;           k = 0;         }       } else if (pd[i][j][k] == 2) {         ans.push_back(make_pair(cus[i].i, sb[i].i));         if (i == C - 1) {           break;         } else if (cus[i + 1].f == cus[i].f) {           i++;           k = 1;         } else if (cus[i + 1].f == cus[i].f + 1) {           i++;           j = 1;           k = 0;         } else {           i++;           j = 0;           k = 0;         }       }     }     printf( %d n , ans.size());     for (i = 0; i < ans.size(); i++)       printf( %d %d n , ans[i].first, ans[i].second);   }   void GetShoe(int s, Shoe &shoe) {     map<int, Shoe>::iterator it;     it = bst.find(s);     shoe = (it != bst.end() ? it->second : Shoe(INT_MAX, -1));   }   void input() {     int S, i;     scanf( %d , &S);     for (i = 1; i <= S; i++) {       int p, s;       scanf( %d%d , &p, &s);       bst.insert(make_pair(s, Shoe(p, i)));     }     scanf( %d , &C);     for (i = 0; i < C; i++) {       scanf( %d%d , &cus[i].m, &cus[i].f);       cus[i].i = i + 1;     }     sort(cus, cus + C);     for (i = 0; i < C; i++) {       GetShoe(cus[i].f, sa[i]);       GetShoe(cus[i].f + 1, sb[i]);     }   }   int main() {     input();     solve();     return 0;   }