/// Msaa el 5ra
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")

#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define F first
#define S second
#define f(i, a, b) for (int i = a; i < b; i++)
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define sz(x) (int)(x).size()
#define mp(x, y) make_pair(x, y)
#define popCnt(x) (__builtin_popcountll(x))
// #define int ll

using ll = long long;
using ii = pair<int, int>;
using ull = unsigned long long;

const int N = 4e5 + 5;
const int M = 4e5 + 5;
const int A = 26;
const int LG = 19;
const int MOD =
        // (119 << 23) + 1;
        1e9 + 7;
const long double PI = acos(-1);
const long double EPS = 1e-7;

const ll MAX = 1e15;

const int ms = int(1e6) + 20;

using Matrix = array<array<int, 101>, 101>;

// Matrix multiplication
Matrix multiply(const Matrix &a, const Matrix &b, ll m) {
    Matrix result;
    f(i, 0, m)f(j, 0, m)result[i][j] = 0;
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < m; ++j) {
            for (int k = 0; k < m; ++k) {
                result[i][j] = (result[i][j] + 1ll * a[i][k] * b[k][j]) % MOD;
            }
        }
    }
    return result;
}

vector<Matrix> allPowers;

vector<long long> mul(vector<long long> F, Matrix &Tn, int m) {
    reverse(F.begin(), F.end());

    vector<long long> result(m, 0);
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < m; ++j) {
            result[i] = (result[i] + 1ll * Tn[i][j] * F[j]) % MOD;
        }
    }
    return result;
}


void preprocess(int m) {
    Matrix T;
    f(i, 0, m)f(j, 0, m)T[i][j] = 0;

    for (int i = 0; i < m; ++i) {
        T[0][i] = 1; // First row is all ones
    }
    for (int i = 1; i < m; ++i) {
        T[i][i - 1] = 1; // Sub-diagonal is all ones
    }
    allPowers.push_back(T);
    for (int i = 0; i < 60; i++) {
        T = allPowers.back();
        allPowers.push_back(multiply(T, T, m));
    }
}

// Function to compute terms f[n-m], f[n-m+1], ..., f[n-1]
vector<long long> getLastTerms(const vector<long long> &initial, ll n, ll m) {
    // Transition matrix

    // Exponentiate the transition matrix

    // Initial state vector


    n -= m;
    vector<long long> F = initial;
    for (int i = 0; i < 60; i++) {
        if (((n >> i) & 1)) {
            F = mul(F, allPowers[i], m);
            reverse(all(F));
        }
    }
    return F;
}

ll m, n, q;

void doWork() {


    cin >> m >> n >> q;
    preprocess(m);

    vector<ll> init(m);
    for (int i = 0; i < m; i++) cin >> init[i], init[i] = (init[i] + MOD) % MOD;
    vector<pair<ll, ll>> vec;
    f(i, 0, q) {
        ll x, y;
        cin >> x >> y;
        y = (y + MOD) % MOD;
        vec.push_back({x, y});
    }
    sort(all(vec));
    if (vec.back().F == n || m == 1) {
        cout << vec.back().S << endl;
        return;
    }
    ll last_index = m;
    // for (int n=1; n <= 50; n++) {
    //     cout << n << endl;
    //     auto p =getLastTerms(init, m + n - last_index, m);
    //     for (auto x : p)    cout << x << " ";
    //     cout << endl;
    // }
    for (auto [k, v]: vec) {
        auto new_init = getLastTerms(init, (k - last_index - 1) + m, m);
        new_init.erase(new_init.begin());
        new_init.push_back(v);
        init = new_init;
        last_index = k;
    }

    cout << getLastTerms(init, m + n - last_index, m).back() << "\n";

}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int t = 1;
    // cin >> t;
    while (t--) {
        doWork();
    }
}