#include <bits/stdc++.h>
using namespace std;
long long tree[1000000];
int flag[1000000];
;
void update(int l, int x, int y, int r, long long v, int n) {
  if (l == x && r == y) {
    tree[n] = v;
    flag[n] = 1;
    return;
  }
  if (flag[n] == 1) {
    tree[2 * n] = tree[2 * n + 1] = tree[n];
    flag[2 * n] = flag[2 * n + 1] = 1;
    flag[n] = 0;
  }
  int m = (r + l) / 2;
  if (x > m)
    update(m + 1, x, y, r, v, 2 * n + 1);
  else if (y <= m)
    update(l, x, y, m, v, 2 * n);
  else {
    update(m + 1, m + 1, y, r, v, 2 * n + 1);
    update(l, x, m, m, v, 2 * n);
  }
  tree[n] = max(tree[2 * n], tree[2 * n + 1]);
}
long long query(int l, int x, int y, int r, int n) {
  if (l == x && r == y) {
    return tree[n];
  }
  if (flag[n] == 1) return tree[n];
  int m = (r + l) / 2;
  long long a = 0, b = 0;
  if (x > m)
    a = query(m + 1, x, y, r, 2 * n + 1);
  else if (y <= m)
    b = query(l, x, y, m, 2 * n);
  else {
    a = query(m + 1, m + 1, y, r, 2 * n + 1);
    b = query(l, x, m, m, 2 * n);
  }
  return max(a, b);
}
void solve() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    long long t;
    cin >> t;
    update(1, i, i, n, t, 1);
  }
  int m;
  cin >> m;
  for (int i = 1; i <= m; i++) {
    long long w, h;
    cin >> w >> h;
    long long v = query(1, 1, (int)w, n, 1);
    cout << v << endl;
    update(1, 1, (int)w, n, v + h, 1);
  }
}
int main() {
  { solve(); }
  return 0;
}
