// 21:41 - 21:56 #include using namespace std; #define fi first #define se second #define all(x) x.begin(), x.end() #define lch (o << 1) #define rch (o << 1 | 1) typedef double db; typedef long long ll; typedef unsigned int ui; typedef pair pint; typedef tuple tint; const int N = 1e5 + 5; const int MOD = 1e9 + 7; const int INF = 0x3f3f3f3f; const ll INF_LL = 0x3f3f3f3f3f3f3f3f; vector in[N], out[N]; int l[N], r[N]; // [l, r) ll a[N], c[N]; ll f[N], g[N]; int main() { ios::sync_with_stdio(0); int len, n, m; cin >> len >> n >> m; for (int i = 0; i < len; i++) cin >> a[i]; for (int i = 1; i <= len; i++) cin >> c[i]; for (int i = 1; i <= m; i++) { cin >> l[i] >> r[i]; in[l[i]].push_back(i); out[r[i]].push_back(i); } for (int i = len; i < n; i++) for (int j = 1; j <= len; j++) a[i] = (a[i] + a[i - j] * c[j]) % MOD; for (int i = 0; i < n; i++) { // add in if (i - len >= 0) { for (auto j: in[i - len]) { if (r[j] - l[j] < len) continue; for (int k = 1; k <= len; k++) g[i - k] = (g[i - k] + a[len - k]) % MOD; } } // remove out for (auto j: out[i]) { if (r[j] - l[j] < len) continue; int now = r[j] - l[j]; for (int k = 1; k <= len; k++) g[i - k] = (g[i - k] - a[now - k]) % MOD; } // not in g for (int j = 0; j < len; j++) { if (i - j < 0) continue; for (auto k: in[i - j]) { if (r[k] <= i) continue; f[i] = (f[i] + a[j]) % MOD; } } // in g for (int j = 1; j <= len; j++) { f[i] = (f[i] + g[i - j] * c[j]) % MOD; g[i] = (g[i] + g[i - j] * c[j]) % MOD; } } for (int i = 0; i < n; i++) { f[i] = (f[i] % MOD + MOD) % MOD; cout << f[i] << endl; } return 0; }