#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll add(ll a, ll b) {
return ((a % mod) + (b % mod)) % mod;
}
ll mul(ll a, ll b) {
return ((a % mod) * (b % mod)) % mod;
}
ll sub(ll a, ll b) {
return ((a % mod) - (b % mod) + mod) % mod;
}
class Matrix {
public:
ll r, c;
vector<vector<ll>> mat;
Matrix(ll rows, ll cols, ll init = 0) {
r = rows;
c = cols;
mat = vector<vector<ll>>(rows, vector<ll>(cols, init));
}
static Matrix identity(ll n) {
Matrix I(n, n, 0);
for (ll i = 0; i < n; i++)
I.mat[i][i] = 1;
return I;
}
Matrix operator+(const Matrix& other) const {
Matrix res(r, c);
for (ll i = 0; i < r; i++) {
for (ll j = 0; j < c; j++) {
res.mat[i][j] = add(mat[i][j], other.mat[i][j]);
}
}
return res;
}
Matrix& operator+=(const Matrix& other) {
for (ll i = 0; i < r; i++) {
for (ll j = 0; j < c; j++) {
mat[i][j] = add(mat[i][j], other.mat[i][j]);
}
}
return *this;
}
Matrix operator*(const Matrix& other) const {
Matrix res(r, other.c, 0);
for (ll i = 0; i < r; i++) {
for (ll j = 0; j < other.c; j++) {
ll sum = 0;
for (ll k = 0; k < c; k++) {
sum = add(sum, mul(mat[i][k], other.mat[k][j]));
}
res.mat[i][j] = sum;
}
}
return res;
}
Matrix& operator*=(const Matrix& other) {
*this = *this * other;
return *this;
}
Matrix pow(ll n) const {
Matrix base = *this;
Matrix result = Matrix::identity(r);
while (n > 0) {
if (n & 1) result *= base;
base *= base;
n >>= 1;
}
return result;
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
ll m, N, Q;
cin >> m >> N >> Q;
vector<ll> a(m);
for (auto &x : a)
cin >> x;
// Build the companion matrix for f(i) = ∑(previous m numbers)
Matrix orig(m, m, 0);
for (int j = 0; j < m; j++) {
orig.mat[0][j] = 1;
}
for (int i = 1; i < m; i++) {
orig.mat[i][i - 1] = 1;
}
// Base state vector: [f(m), f(m-1), ..., f(1)]^T
Matrix base(m, 1, 0);
for (int i = 0; i < m; i++) {
base.mat[i][0] = a[m - 1 - i];
}
vector<pair<ll, ll>> v;
for (int i = 0; i < Q; i++) {
ll j, f;
cin >> j >> f;
// Ensure the forced value is in the range [0, mod)
v.push_back({j, (f % mod + mod) % mod});
}
ll prev = m; // current index computed
sort(v.begin(), v.end());
for (auto &p : v) {
ll j = p.first, forcedVal = p.second;
if (j <= prev)
continue;
// Jump from 'prev' to forced index j with matrix exponentiation
Matrix R = orig.pow(j - prev);
R *= base;
// Update the state vector: override f(j) with forced value,
// and keep the rest computed as:
// New state should be [f(j)_forced, f(j-1)_computed, ..., f(j-m+1)_computed]^T.
vector<ll> temp(m, 0);
temp[0] = forcedVal;
// Fix: use R.mat[k][0], not R.mat[k-1][0]
for (int k = 1; k < m; k++)
temp[k] = R.mat[k][0];
for (int i = 0; i < m; i++)
base.mat[i][0] = temp[i];
prev = j;
}
ll ans;
if (N <= prev) {
if (N <= m)
ans = ((a[N - 1] % mod) + mod) % mod;
else
ans = base.mat[0][0]; // already computed for N = prev
} else {
Matrix R = orig.pow(N - prev);
R *= base;
ans = R.mat[0][0];
}
cout << ans << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwpjb25zdCBsbCBtb2QgPSAxZTkgKyA3OwoKbGwgYWRkKGxsIGEsIGxsIGIpIHsgCiAgICByZXR1cm4gKChhICUgbW9kKSArIChiICUgbW9kKSkgJSBtb2Q7IAp9CmxsIG11bChsbCBhLCBsbCBiKSB7IAogICAgcmV0dXJuICgoYSAlIG1vZCkgKiAoYiAlIG1vZCkpICUgbW9kOyAKfQpsbCBzdWIobGwgYSwgbGwgYikgeyAKICAgIHJldHVybiAoKGEgJSBtb2QpIC0gKGIgJSBtb2QpICsgbW9kKSAlIG1vZDsgCn0KCmNsYXNzIE1hdHJpeCB7CnB1YmxpYzoKICAgIGxsIHIsIGM7CiAgICB2ZWN0b3I8dmVjdG9yPGxsPj4gbWF0OwogICAgTWF0cml4KGxsIHJvd3MsIGxsIGNvbHMsIGxsIGluaXQgPSAwKSB7CiAgICAgICAgciA9IHJvd3M7CiAgICAgICAgYyA9IGNvbHM7CiAgICAgICAgbWF0ID0gdmVjdG9yPHZlY3RvcjxsbD4+KHJvd3MsIHZlY3RvcjxsbD4oY29scywgaW5pdCkpOwogICAgfQogICAgc3RhdGljIE1hdHJpeCBpZGVudGl0eShsbCBuKSB7CiAgICAgICAgTWF0cml4IEkobiwgbiwgMCk7CiAgICAgICAgZm9yIChsbCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgSS5tYXRbaV1baV0gPSAxOwogICAgICAgIHJldHVybiBJOwogICAgfQogICAgTWF0cml4IG9wZXJhdG9yKyhjb25zdCBNYXRyaXgmIG90aGVyKSBjb25zdCB7CiAgICAgICAgTWF0cml4IHJlcyhyLCBjKTsKICAgICAgICBmb3IgKGxsIGkgPSAwOyBpIDwgcjsgaSsrKSB7CiAgICAgICAgICAgIGZvciAobGwgaiA9IDA7IGogPCBjOyBqKyspIHsKICAgICAgICAgICAgICAgIHJlcy5tYXRbaV1bal0gPSBhZGQobWF0W2ldW2pdLCBvdGhlci5tYXRbaV1bal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICBNYXRyaXgmIG9wZXJhdG9yKz0oY29uc3QgTWF0cml4JiBvdGhlcikgewogICAgICAgIGZvciAobGwgaSA9IDA7IGkgPCByOyBpKyspIHsKICAgICAgICAgICAgZm9yIChsbCBqID0gMDsgaiA8IGM7IGorKykgewogICAgICAgICAgICAgICAgbWF0W2ldW2pdID0gYWRkKG1hdFtpXVtqXSwgb3RoZXIubWF0W2ldW2pdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBNYXRyaXggb3BlcmF0b3IqKGNvbnN0IE1hdHJpeCYgb3RoZXIpIGNvbnN0IHsKICAgICAgICBNYXRyaXggcmVzKHIsIG90aGVyLmMsIDApOwogICAgICAgIGZvciAobGwgaSA9IDA7IGkgPCByOyBpKyspIHsKICAgICAgICAgICAgZm9yIChsbCBqID0gMDsgaiA8IG90aGVyLmM7IGorKykgewogICAgICAgICAgICAgICAgbGwgc3VtID0gMDsKICAgICAgICAgICAgICAgIGZvciAobGwgayA9IDA7IGsgPCBjOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICBzdW0gPSBhZGQoc3VtLCBtdWwobWF0W2ldW2tdLCBvdGhlci5tYXRba11bal0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcy5tYXRbaV1bal0gPSBzdW07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIE1hdHJpeCYgb3BlcmF0b3IqPShjb25zdCBNYXRyaXgmIG90aGVyKSB7CiAgICAgICAgKnRoaXMgPSAqdGhpcyAqIG90aGVyOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIE1hdHJpeCBwb3cobGwgbikgY29uc3QgewogICAgICAgIE1hdHJpeCBiYXNlID0gKnRoaXM7CiAgICAgICAgTWF0cml4IHJlc3VsdCA9IE1hdHJpeDo6aWRlbnRpdHkocik7CiAgICAgICAgd2hpbGUgKG4gPiAwKSB7CiAgICAgICAgICAgIGlmIChuICYgMSkgcmVzdWx0ICo9IGJhc2U7CiAgICAgICAgICAgIGJhc2UgKj0gYmFzZTsKICAgICAgICAgICAgbiA+Pj0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgY291dC50aWUobnVsbHB0cik7CiAgICAKICAgIGxsIG0sIE4sIFE7CiAgICBjaW4gPj4gbSA+PiBOID4+IFE7CiAgICB2ZWN0b3I8bGw+IGEobSk7CiAgICBmb3IgKGF1dG8gJnggOiBhKQogICAgICAgIGNpbiA+PiB4OwogICAgCiAgICAvLyBCdWlsZCB0aGUgY29tcGFuaW9uIG1hdHJpeCBmb3IgZihpKSA9IOKIkShwcmV2aW91cyBtIG51bWJlcnMpCiAgICBNYXRyaXggb3JpZyhtLCBtLCAwKTsKICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKSB7CiAgICAgICAgb3JpZy5tYXRbMF1bal0gPSAxOyAgCiAgICB9CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG07IGkrKykgewogICAgICAgIG9yaWcubWF0W2ldW2kgLSAxXSA9IDE7CiAgICB9CiAgICAKICAgIC8vIEJhc2Ugc3RhdGUgdmVjdG9yOiBbZihtKSwgZihtLTEpLCAuLi4sIGYoMSldXlQKICAgIE1hdHJpeCBiYXNlKG0sIDEsIDApOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBiYXNlLm1hdFtpXVswXSA9IGFbbSAtIDEgLSBpXTsKICAgIH0KICAgIAogICAgdmVjdG9yPHBhaXI8bGwsIGxsPj4gdjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUTsgaSsrKSB7CiAgICAgICAgbGwgaiwgZjsKICAgICAgICBjaW4gPj4gaiA+PiBmOwogICAgICAgIC8vIEVuc3VyZSB0aGUgZm9yY2VkIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbMCwgbW9kKQogICAgICAgIHYucHVzaF9iYWNrKHtqLCAoZiAlIG1vZCArIG1vZCkgJSBtb2R9KTsKICAgIH0KICAgIAogICAgbGwgcHJldiA9IG07IC8vIGN1cnJlbnQgaW5kZXggY29tcHV0ZWQKICAgIHNvcnQodi5iZWdpbigpLCB2LmVuZCgpKTsKICAgIGZvciAoYXV0byAmcCA6IHYpIHsKICAgICAgICBsbCBqID0gcC5maXJzdCwgZm9yY2VkVmFsID0gcC5zZWNvbmQ7CiAgICAgICAgaWYgKGogPD0gcHJldikKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgLy8gSnVtcCBmcm9tICdwcmV2JyB0byBmb3JjZWQgaW5kZXggaiB3aXRoIG1hdHJpeCBleHBvbmVudGlhdGlvbgogICAgICAgIE1hdHJpeCBSID0gb3JpZy5wb3coaiAtIHByZXYpOwogICAgICAgIFIgKj0gYmFzZTsKICAgICAgICAvLyBVcGRhdGUgdGhlIHN0YXRlIHZlY3Rvcjogb3ZlcnJpZGUgZihqKSB3aXRoIGZvcmNlZCB2YWx1ZSwKICAgICAgICAvLyBhbmQga2VlcCB0aGUgcmVzdCBjb21wdXRlZCBhczoKICAgICAgICAvLyBOZXcgc3RhdGUgc2hvdWxkIGJlIFtmKGopX2ZvcmNlZCwgZihqLTEpX2NvbXB1dGVkLCAuLi4sIGYoai1tKzEpX2NvbXB1dGVkXV5ULgogICAgICAgIHZlY3RvcjxsbD4gdGVtcChtLCAwKTsKICAgICAgICB0ZW1wWzBdID0gZm9yY2VkVmFsOwogICAgICAgIC8vIEZpeDogdXNlIFIubWF0W2tdWzBdLCBub3QgUi5tYXRbay0xXVswXQogICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDwgbTsgaysrKQogICAgICAgICAgICB0ZW1wW2tdID0gUi5tYXRba11bMF07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspCiAgICAgICAgICAgIGJhc2UubWF0W2ldWzBdID0gdGVtcFtpXTsKICAgICAgICBwcmV2ID0gajsKICAgIH0KICAgIAogICAgbGwgYW5zOwogICAgaWYgKE4gPD0gcHJldikgewogICAgICAgIGlmIChOIDw9IG0pCiAgICAgICAgICAgIGFucyA9ICgoYVtOIC0gMV0gJSBtb2QpICsgbW9kKSAlIG1vZDsKICAgICAgICBlbHNlIAogICAgICAgICAgICBhbnMgPSBiYXNlLm1hdFswXVswXTsgLy8gYWxyZWFkeSBjb21wdXRlZCBmb3IgTiA9IHByZXYKICAgIH0gZWxzZSB7CiAgICAgICAgTWF0cml4IFIgPSBvcmlnLnBvdyhOIC0gcHJldik7CiAgICAgICAgUiAqPSBiYXNlOwogICAgICAgIGFucyA9IFIubWF0WzBdWzBdOwogICAgfQogICAgCiAgICBjb3V0IDw8IGFucyA8PCAnXG4nOwogICAgcmV0dXJuIDA7Cn0=