Buggy python submission (verdict: Runtime Error):
# M回の操作終了後に N枚のカードに書かれた整数の合計の最大値を求めてください。
# で操作はB_j 枚以下の任意のカードをC_jに置き換えるという処理ができる。
# つまり、元のカードの値Aをソートして、小さいものから順にC_jの大きいもので並び替えれば良い
import sys
input=sys.stdin.readline
n,m = map(int,input().split())
a = list(map(int,input().split()))
a.sort()
b_c = [list(map(int,input().split())) for _ in range(m)]
b_c.sort(key = lambda x:x[1], reverse=True) # c でソートする
pos = 0
ans = sum(a)
for i in range(m): # 一応最後までb_c をループするようにして、c よりも元のカードが大きくなったらbreakする
  if a[pos + b_c[i][0] - 1] > b_c[i][1]:
    for j in range(b_c[i][0]): #　何番目までは入れ替えた方が特か判定
      if a[pos + j] > b_c[i][1] or pos + j >= n:
        break
      else:
        ans += b_c[i][1] - a[pos + j] # 置き換えによる増加量
    break
  else:
    for j in range(b_c[i][0]): #　
      ans += b_c[i][1] - a[pos + j]
    pos += b_c[i][0]
print(ans)
# 最初はエラー : b_c[i][0]をb_c[0]でやっていたから
# 次は値がおかしい。sortがb_cは逆順（大きいものから順に）にする必要がある
# そのためには, reverse=True を入れる
# しかし、これでも入力例2で異なる答え、入力例4でエラーが出る。
# posをたす位置がおかしかった
# ここで提出したが、まさかのRE 時間がかかりすぎ
# 一応O(N)で収まっているはずだが、定数倍の高速化が必要
# 

Fixed submission:
#!/usr/bin/env python3
n,m = map(int,input().split())
a = list(map(int,input().split()))
a.sort()
b = [0]*m
c = [0]*m
for i in range(m):
    b[i],c[i] = map(int,input().split())
c,b = zip(*sorted(zip(c,b)))#c でソートする
# 整数列a からmin からc にb枚まで帰る操作を繰り返した時のsumのmaxを求める
# C の大きい順から、Nを超えないまで並べていく
# もし、そのtotalがN を超える場合は、そのできた配列とaをソートしたものを比べて、
# aをソートしたものの方が大きいところがあれば修正する
# もしtotla がNを超えないなら、小さい順から置き換えたもののそのままでOK
# 実装としては、ソートしたaを前から順番にc[i]より大きいか比べていく
cb = 0
idx = 0
for i in range(n):
    if cb == m:break
    else:
        if a[i] < c[m-1-cb]:a[i] = c[m-1-cb]
        idx += 1
        if idx == b[m-1-cb]:
            idx = 0
            cb += 1
print(sum(a))

Buggy python submission (verdict: Runtime Error):
# M回の操作終了後に N枚のカードに書かれた整数の合計の最大値を求めてください。
# で操作はB_j 枚以下の任意のカードをC_jに置き換えるという処理ができる。
# つまり、元のカードの値Aをソートして、小さいものから順にC_jの大きいもので並び替えれば良い
n,m = map(int,input().split())
a = list(map(int,input().split()))
a.sort()
b_c = [list(map(int,input().split())) for _ in range(m)]
b_c.sort(key = lambda x:x[1], reverse=True) # c でソートする
pos = 0
ans = sum(a)
for i in range(m): # 一応最後までb_c をループするようにして、c よりも元のカードが大きくなったらbreakする
  if a[pos + b_c[i][0] - 1] > b_c[i][1]:
    for j in range(b_c[i][0]): #　何番目までは入れ替えた方が特か判定
      if a[pos + j] > b_c[i][1] or pos + j >= n:
        break
      else:
        ans += b_c[i][1] - a[pos + j] # 置き換えによる増加量
    break
  else:
    for j in range(b_c[i][0]): #　
      ans += b_c[i][1] - a[pos + j]
    pos += b_c[i][0]
print(ans)
# 最初はエラー : b_c[i][0]をb_c[0]でやっていたから
# 次は値がおかしい。sortがb_cは逆順（大きいものから順に）にする必要がある
# そのためには, reverse=True を入れる
# しかし、これでも入力例2で異なる答え、入力例4でエラーが出る。


Fixed submission:
#!/usr/bin/env python3
n,m = map(int,input().split())
a = list(map(int,input().split()))
a.sort()
b = [0]*m
c = [0]*m
for i in range(m):
    b[i],c[i] = map(int,input().split())
c,b = zip(*sorted(zip(c,b)))#c でソートする
# 整数列a からmin からc にb枚まで帰る操作を繰り返した時のsumのmaxを求める
# C の大きい順から、Nを超えないまで並べていく
# もし、そのtotalがN を超える場合は、そのできた配列とaをソートしたものを比べて、
# aをソートしたものの方が大きいところがあれば修正する
# もしtotla がNを超えないなら、小さい順から置き換えたもののそのままでOK
# 実装としては、ソートしたaを前から順番にc[i]より大きいか比べていく
cb = 0
idx = 0
for i in range(n):
    if cb == m:break
    else:
        if a[i] < c[m-1-cb]:a[i] = c[m-1-cb]
        idx += 1
        if idx == b[m-1-cb]:
            idx = 0
            cb += 1
print(sum(a))