import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static final int N = 500010, INF = 0x3f3f3f3f;
static Node[] tr = new Node[N * 4];
static int[] a = new int[N];
static int n, m;
public static void main(String[] args) {
FastReader sc = new FastReader();
n = sc.nextInt();
long sum = 0;
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
sum += a[i];
}
build(1, 1, n);
m = sc.nextInt();
while (m -- > 0) {
int l = sc.nextInt(), r = sc.nextInt();
l = find(l);
r = find(r);
Pair pp = querymin(1, 1, n, l, r);
int idx = pp.x;
sum -= a[idx];
update(1, 1, n, idx);
}
System.out.println(sum);
}
static void update(int u, int l, int r, int x) {
if (l == r) {
tr[u].sum = 0;
tr[u].min = INF;
return;
}
int mid = l + r >> 1;
if (x <= mid) update(u * 2, l, mid, x);
else update(u * 2 + 1, mid + 1, r, x);
pushup(u);
}
static Pair querymin(int u, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return new Pair(tr[u].idx, tr[u].min);
int mid = l + r >> 1;
if (qr <= mid) return querymin(u * 2, l, mid, ql, qr);
else if (ql > mid) return querymin(u * 2 + 1, mid + 1, r, ql, qr);
else {
Pair left = querymin(u * 2, l, mid, ql, qr);
Pair right = querymin(u * 2 + 1, mid + 1, r, ql, qr);
if (left.y <= right.y) return left;
else return right;
}
}
static int querysum(int u, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return tr[u].sum;
int mid = l + r >> 1;
if (qr <= mid) return querysum(u * 2, l, mid, ql, qr);
else if (ql > mid) return querysum(u * 2 + 1, mid + 1, r, ql, qr);
else return querysum(u * 2, l, mid, ql, qr) + querysum(u * 2 + 1, mid + 1, r, ql, qr);
}
static int find(int x) {
int l = 1, r = n;
while (l < r) {
int mid = l + r >> 1;
if (querysum(1, 1, n, 1, mid) >= x) r = mid;
else l = mid + 1;
}
return r;
}
static void build(int u, int l, int r) {
tr[u] = new Node();
if (l == r) {
tr[u].sum = 1;
tr[u].min = a[l];
tr[u].idx = l;
return;
}
int mid = l + r >> 1;
build(u * 2, l, mid);
build(u * 2 + 1, mid + 1, r);
pushup(u);
}
static void pushup(int u) {
tr[u].sum = tr[u * 2].sum + tr[u * 2 + 1].sum;
if (tr[u * 2].min <= tr[u * 2 + 1].min) {
tr[u].min = tr[u * 2].min;
tr[u].idx = tr[u * 2].idx;
} else {
tr[u].min = tr[u * 2 + 1].min;
tr[u].idx = tr[u * 2 + 1].idx;
}
}
static class Pair {
int x, y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
}
static class Node {
int sum;//区间有效值
int min;//区间最小值
int idx;//最小值的下标
}
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreTokens()) {
try {
st = new StringTokenizer(br.readLine(), " ");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return st.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
}
}