#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<ll, null_type, less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update>
#define endl '\n'
using ll = int;
#define pb push_back
#define eb emplace_back
#define pF first
#define pS second
#define SP << " " <<
const ll mod7 = 10007;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
ll a[112345], b[112345];
struct segmentTree {
vector<vector<ll>> v;
vector<ll> merged;
ll offset;
segmentTree(ll n) {
offset = 1;
while (offset<n) offset*=2;
v.resize(offset*2, vector<ll>(23, 0));
merged.resize(23, 0);
for (auto &i : v) i[0] = 1;
}
void merge(vector<ll> &x, vector<ll> &y) {
for (int i = 0; i <= 21; i++) {
for (int j = 0; j <= 21; j++) {
merged[min(21,i+j)] += ((long long)x[i] * (long long)y[j])%mod7;
}
}
}
void upd(ll i, ll x, ll y) {
i += offset;
v[i][0] = y, v[i][1] = x;
while (i/=2) {
for (int j = 0; j<=21; j++) merged[j] = 0;
merge(v[i * 2], v[i * 2 + 1]);
v[i] = std::move(merged);
}
}
ll query(ll c) {
ll ans = 0;
for (int i = c; i <= 21; i++) {ans += v[1][i], ans %= mod7;}
return ans;
}
};
int main() {
ios::sync_with_stdio(0); cout.tie(0); cin.tie(0);
ll n, c; cin>>n>>c;
for (int i=1; i<=n; i++) {long long x; cin>>x; a[i] = x%mod7;}
for (int i=1; i<=n; i++) {long long x; cin>>x; b[i] = x%mod7;}
segmentTree tree(n);
for (int i=1; i<=n; i++) tree.upd(i-1, a[i], b[i]);
ll q; cin>>q;
while (q--) {
ll i, x, y; cin>>i>>x>>y;
tree.upd(i-1, x%mod7, y%mod7);
cout << tree.query(c) << endl;
}
}