#include <bits/stdc++.h>
using namespace std;
int N;
typedef struct Nodo {
  long long int v, l;
} Nodo;
int S;
Nodo segtree[2000024];
inline void st_init(int N) {
  if (__builtin_popcount(N) <= 1) {
    S = N;
  } else {
    for (; __builtin_popcount(N) > 1; N -= N & -N)
      ;
    S = N << 1;
  }
  memset(segtree, 0, (sizeof(Nodo) * S) << 1);
}
inline void st_deflag(int p) {
  long long int l = segtree[p].l;
  if (!l) {
    return;
  }
  if (p < S) {
    long long int &a = segtree[p << 1].l;
    long long int &b = segtree[(p << 1) + 1].l;
    a = l;
    b = l;
  }
  segtree[p].v = l;
  segtree[p].l = 0;
}
inline void st_update(int n) {
  long long int l = segtree[n << 1].v;
  long long int r = segtree[(n << 1) + 1].v;
  segtree[n].v = (l > r ? l : r);
}
void st_set(int n, int a, int b, int i, int f, long long int v) {
  st_deflag(n);
  if (i >= a && f <= b) {
    segtree[n].l = v;
    st_deflag(n);
    return;
  } else if (f < a || i > b) {
    return;
  }
  int d = ((f - i) >> 1) + 1;
  st_set(n << 1, a, b, i, f - d, v);
  st_set((n << 1) + 1, a, b, i + d, f, v);
  st_update(n);
}
long long int st_query(int n, int a, int b, int i, int f) {
  st_deflag(n);
  if (i >= a && f <= b) {
    return segtree[n].v;
  } else if (f < a || i > b) {
    return -0x3f3f3f3f3f3f3f3fll;
  }
  int d = ((f - i) >> 1) + 1;
  long long int r1 = st_query(n << 1, a, b, i, f - d);
  long long int r2 = st_query((n << 1) + 1, a, b, i + d, f);
  return (r1 > r2 ? r1 : r2);
}
int M;
int W, H;
int main() {
  int i, a;
  long long R;
  scanf("%d", &N);
  st_init(N);
  for (i = 0; i < N; i++) {
    scanf("%d", &a);
    st_set(1, i, i, 0, S - 1, (long long)a);
  }
  scanf("%d", &M);
  for (i = 0; i < M; i++) {
    scanf("%d %d", &W, &H);
    R = st_query(1, 0, (W - 1 < N - 1 ? W - 1 : N - 1), 0, S - 1);
    printf("%I64d\n", R);
    st_set(1, 0, (W - 1 < N - 1 ? W - 1 : N - 1), 0, S - 1, R + (long long)H);
  }
  return 0;
}
