
fun main(args: Array<String>) {

    val (n, m) = readLine()!!.split(" ").map { it.toLong() }

    var A = readLine()!!.split(" ").map { it.toLong() }.toMutableList()

    // Cj 以下　で　下から Bj 枚を Cj に書き換える

    // A は  10^5 配列 で 10^5 回 上記の操作を行う -> 毎回要素を全探索は出来ない

    // 単純に全部の要素を追加した上で，ソートをしてみる
    // 追加は一気にできるとして，最後配列のソートが nlogn <= 10^8 ならば行ける
    //  Bj < 10^5 で 置き換えが 10^5 回発生するから，最悪ケースでは要素数が 10^5 + 10^5 x 10^5 になって計算時間がダメそうだが？？

    // やってみる -> やはり TLE （想定通りで良かった？？)
    // 入れ替え候補の選び方が肝
    // map を作成し，入れ替える値と，その枚数をもつ -> ソート，-> 値が大きい map から順に，N枚になるまで取得する

    val candidates = mutableListOf<Pair<Long, Long>>()
    for (i in 0 until m) {
        val (b, c) = readLine()!!.split(" ").map { it.toLong() }
        candidates.add(Pair(b, c))
    }
    
    val candidatesSorted = candidates.sortedByDescending { it.second }
    
    var count = 0L
    var candSelected = mutableListOf<Long>()
    for (c in candidatesSorted){
        
        candSelected.addAll(LongArray(c.first.toInt()) {c.second}.toList())
        count += c.first
        
        if (count > n) {
            candSelected = candSelected.subList(0, n.toInt())
            break
        }
    }
    
    
    // 元の列と，変換候補 N 個 を結合して，ソートした上で上位N 個を取得，総和
    A.addAll(candSelected)
    
    println(A.sortedDescending().toList().subList(0, n.toInt()).sum())
}