#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
/**
* EGOI 2022 - DataCenters Çözümü
*
* Strateji: Makine sayılarını ve bu sayıya sahip veri merkezi adetlerini
* azalan sırada bir map'te tutuyoruz. Her adımda en yüksek değerli c adet
* veri merkezini bulup m miktarını çıkarıyoruz ve map'i güncelliyoruz.
*/
int main() {
// Hızlı I/O için senkronizasyonu kapatıyoruz
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, s;
if (!(cin >> n >> s)) return 0;
// map<MakineSayisi, VeriMerkeziAdedi, greater<long long>>
// greater ile en çok makinesi olan veri merkezleri her zaman en üstte olur.
map<long long, int, greater<long long>> counts;
for (int i = 0; i < n; ++i) {
long long val;
cin >> val;
counts[val]++;
}
for (int i = 0; i < s; ++i) {
long long m, c_needed;
cin >> m >> c_needed;
// Bu adımda güncellenen makine sayılarını burada biriktirip
// map döngüsü bittikten sonra toplu ekleyeceğiz.
vector<pair<long long, int>> to_reinsert;
while (c_needed > 0) {
// counts.begin() her zaman mevcut en büyük makine sayısına sahip grubu verir.
auto it = counts.begin();
if (it == counts.end()) break;
long long current_val = it->first;
int current_count = it->second;
// Gereken kopya sayısı (c) ile eldeki grup miktarından hangisi azsa onu alıyoruz.
int take = (c_needed < (long long)current_count) ? (int)c_needed : current_count;
// Yeni makine sayısı: Mevcut - m
to_reinsert.push_back({current_val - m, take});
// Eğer gruptaki herkesi aldıysak sil, yoksa miktarını azalt.
if (take == current_count) {
counts.erase(it);
} else {
it->second -= take;
}
c_needed -= take;
}
// Güncellenen değerleri map'e geri ekliyoruz.
// Aynı değere sahip olanlar otomatik olarak birleşir (counts[val] += count).
for (auto const& p : to_reinsert) {
counts[p.first] += p.second;
}
}
// Sonuçları azalan sırada yazdırıyoruz.
bool first = true;
for (auto const& entry : counts) {
for (int i = 0; i < entry.second; ++i) {
if (!first) cout << " ";
cout << entry.first;
first = false;
}
}
cout << endl;
return 0;
}