//  [c]
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#define MAX (1 << 18) /* 262144 */

int ki[MAX * 2 - 1];

void ki_add(int idx, int value) {
	int pos = (MAX - 1) + idx;
	ki[pos] += value;
	while (pos > 0) {
		pos = (pos - 1) / 2;
		ki[pos] += value;
	}
}

int ki_get_i(int idx, int qmin, int qmax, int smin, int smax) {
	if (qmax <= smin || smax <= qmin) { /* クエリがセグメントから完全に外れている */
		return 0;
	} else if (qmin <= smin && smax <= qmax) { /* セグメントがクエリに完全に含まれる */
		return ki[idx];
	} else {
		int smid = smin + (smax - smin) / 2;
		int left = ki_get_i(idx * 2 + 1, qmin, qmax, smin, smid);
		int right = ki_get_i(idx * 2 + 2, qmin, qmax, smid, smax);
		return left + right;
	}
}

int ki_get(int min, int max) {
	return min >= max ? 0 : ki_get_i(0, min, max, 0, MAX);
}

int mizuhasu(const void* x, const void* y) {
	int a = *(const int*)x, b = *(const int*)y;
	return a < b ? -1 : a > b;
}

int N, M;
int A[114514];
int B[114514];
int C[114514];

int asumi;
int iguti[271828];

int ogurayui(int hikasayouko) {
	int l = 0, r = asumi - 1;
	while (l <= r) {
		int m = l + (r - l) / 2;
		if (iguti[m] == hikasayouko) return m;
		else if (iguti[m] < hikasayouko) l = m + 1;
		else r = m - 1;
	}
	printf("ERROR: %d not found\n", hikasayouko);
	exit(2);
}

int main(void) {
	int i;
	int minpos = 0;
	int64_t answer;
	if (scanf("%d%d", &N, &M) != 2) return 1;
	for (i = 0; i < N; i++) {
		if (scanf("%d", &A[i]) != 1) return 1;
		iguti[i] = A[i];
	}
	for (i = 0; i < M; i++) {
		if (scanf("%d%d", &B[i], &C[i]) != 2) return 1;
		iguti[N + i] =C[i];
	}
	qsort(iguti, N + M, sizeof(*iguti), mizuhasu);
	asumi = 1;
	for (i = 1; i < N + M; i++) {
		if (iguti[asumi - 1] != iguti[i]) {
			iguti[asumi++] = iguti[i];
		}
	}
	for (i = 0; i < N; i++) {
		ki_add(ogurayui(A[i]), 1);
	}
	for (i = 0; i < M; i++) {
		int targetRightMost;
		/* 存在するカードの枚数がB_j以上になる一番左の場所を探す */
		int no = minpos - 1, yes = asumi - 1;
		while (no + 1 < yes) {
			int mid = no + (yes - no) / 2;
			if (ki_get(minpos, mid + 1) >= B[i]) yes = mid; else no = mid;
		}
		targetRightMost = yes;
		if (iguti[targetRightMost] >= C[i]) {
			/* C_j未満のカードのみを選ぶ */
			if (iguti[minpos] < C[i]) {
				int less = minpos, ge = targetRightMost;
				while (less + 1 < ge) {
					int mid = less + (ge - less) / 2;
					if (iguti[mid] < C[i]) less = mid; else ge = mid;
				}
				targetRightMost = less;
			} else {
				targetRightMost = minpos - 1;
			}
		}
		if (targetRightMost >= minpos) {
			int sum = ki_get(minpos, targetRightMost + 1);
			if (sum > B[i]) {
				/* 対象範囲の右端は残る */
				int nokoru = sum - B[i];
				int kezuru1 = ki_get(minpos, targetRightMost);
				int kezuru2 = ki_get(targetRightMost, targetRightMost + 1) - nokoru;
				minpos = targetRightMost;
				ki_add(targetRightMost, -kezuru2);
				ki_add(ogurayui(C[i]), kezuru1 + kezuru2);
			} else {
				/* 対象範囲は全部消す (C_j「未満」のみを操作対象にする、がここに効いてくる) */
				minpos = targetRightMost + 1;
				ki_add(ogurayui(C[i]), sum);
			}
		}
	}

	answer = 0;
	for (i = minpos; i < asumi; i++) {
		answer += ki_get(i, i + 1) * (int64_t)iguti[i];
	}
	printf("%" PRId64 "\n", answer);
	return 0;
}

/*

それぞれの操作前の状態において、小さい方からB_j枚まで選ぶ。
ただし、C_j以上のカードは選ばない。

「書き換える」は、選んだカードを消してその枚数C_jが書かれたカードを出すとみなせる。

*/