#include <bits/stdc++.h>
using namespace std;
struct node {
  node* son[2];
  long long d, add;
};
node STK[400001], *head = STK;
node* Root;
int a[100001], n, m;
void update(node* p) {
  if (!p) return;
  p->d = 0;
  if (p->son[0]) p->d = max(p->d, p->son[0]->d);
  if (p->son[1]) p->d = max(p->d, p->son[1]->d);
}
void update_add(node* p, long long d) {
  p->d = max(p->d, d);
  p->add = max(p->add, d);
}
void pushdown(node* p) {
  if (!p) return;
  if (p->add) {
    if (p->son[0]) update_add(p->son[0], p->add);
    if (p->son[1]) update_add(p->son[1], p->add);
    p->add = 0;
  }
}
void Modify(node* p, int L, int R, int l, int r, long long d) {
  pushdown(p);
  if (L == l && R == r) {
    update_add(p, d);
    return;
  }
  int mid = (L + R) >> 1;
  if (r <= mid)
    Modify(p->son[0], L, mid, l, r, d);
  else if (l > mid)
    Modify(p->son[1], mid + 1, R, l, r, d);
  else
    Modify(p->son[0], L, mid, l, mid, d),
        Modify(p->son[1], mid + 1, R, mid + 1, r, d);
  update(p);
}
long long Query(node* p, int L, int R, int l, int r) {
  pushdown(p);
  if (L == l && R == r) return p->d;
  int mid = (L + R) >> 1;
  if (r <= mid)
    return Query(p->son[0], L, mid, l, r);
  else if (l > mid)
    return Query(p->son[1], mid + 1, R, l, r);
  else
    return max(Query(p->son[0], L, mid, l, mid),
               Query(p->son[1], mid + 1, R, mid + 1, r));
}
node* Build_tree(int L, int R) {
  node* p = ++head;
  if (L == R) {
    p->d = a[L];
    return p;
  }
  int mid = (L + R) >> 1;
  p->son[0] = Build_tree(L, mid);
  p->son[1] = Build_tree(mid + 1, R);
  update(p);
  return p;
}
int main() {
  int x, y;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  Root = Build_tree(1, n);
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &x, &y);
    long long tmp = Query(Root, 1, n, 1, x);
    printf("%I64d\n", tmp);
    Modify(Root, 1, n, 1, x, y + tmp);
  }
  return 0;
}
