#include <bits/stdc++.h>
using namespace std;
struct node {
  long long max;
  long long add;
};
long long a[100000];
struct node t[410000];
void build(long long a[], int v, int tl, int tr) {
  if (tl == tr) {
    t[v].max = a[tl];
    t[v].add = 0;
  } else {
    int tm = (tl + tr) / 2;
    build(a, v * 2, tl, tm);
    build(a, v * 2 + 1, tm + 1, tr);
    t[v].max = max(t[v * 2].max, t[v * 2 + 1].max);
    t[v].add = 0;
  }
}
void push(int v) {
  if (t[v].add) {
    t[v].max = max(t[v].max, t[v].add);
    t[2 * v].add = t[2 * v + 1].add = t[v].add;
    t[v].add = 0;
  }
}
long long tmax(int v, int tl, int tr, int l, int r) {
  if (l > r) return -1000000000;
  push(v);
  if (l == tl && r == tr) return t[v].max;
  int tm = (tl + tr) / 2;
  return max(tmax(v * 2, tl, tm, l, min(r, tm)),
             tmax(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
}
void update(int v, int tl, int tr, int l, int r, long long add) {
  if (l > r) return;
  if (l == tl && r == tr) {
    t[v].add = add;
    t[v].max = max(t[v].max, t[v].add);
  } else {
    push(v);
    int tm = (tl + tr) / 2;
    update(v * 2, tl, tm, l, min(r, tm), add);
    update(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r, add);
    t[v].max = max(t[2 * v + 1].max, t[2 * v].max);
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%lld", &a[i]);
  build(a, 1, 0, n - 1);
  int q;
  scanf("%d", &q);
  int w, h;
  long long a;
  for (int i = 0; i < q; i++) {
    scanf("%d%d", &w, &h);
    a = tmax(1, 0, n - 1, 0, w - 1);
    printf("%lld\n", a);
    update(1, 0, n - 1, 0, w - 1, (long long)h + a);
  }
  return 0;
}
