#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define fs first
#define sc second
using namespace std;
const int N = 1e5 + 5, MOD = 10007;
int n, C, q, a[N], b[N];
int sz;
int v[21][4 * N], v1[4 * N];
void build(int i, int l, int r) {
if (r - l == 1) {
if (l < n) {
v[0][i] = b[l] % MOD;
v[1][i] = a[l] % MOD;
v1[i] = (a[l] + b[l]) % MOD;
} else {
// If this is a "dummy" leaf (padding), set to 1 (neutral element)
v[0][i] = 1;
v1[i] = 1;
}
return;
}
int m = (l + r) / 2;
build(2 * i + 1, l, m);
build(2 * i + 2, m, r);
for (int j = 0; j <= C; j++) v[j][i] = 0;
for (int j = 0; j <= C; j++) {
for (int k = 0; k <= C - j; k++) {
v[j + k][i] = (v[j + k][i] + v[j][2 * i + 1] * v[k][2 * i + 2]) % MOD;
}
}
v1[i] = v1[2 * i + 1] * v1[2 * i + 2] % MOD;
}
void upd(int pos, int i, int l, int r) {
if (r - l == 1) {
v[0][i] = b[l] % MOD;
v[1][i] = a[l] % MOD;
v1[i] = (a[l] + b[l]) % MOD;
return;
}
int m = (l + r) / 2;
if (pos < m) upd(pos, 2 * i + 1, l, m);
else upd(pos, 2 * i + 2, m, r);
for (int j = 0; j <= C; j++) v[j][i] = 0;
for (int j = 0; j <= C; j++) {
for (int k = 0; k <= C - j; k++) {
v[j + k][i] = (v[j + k][i] + v[j][2 * i + 1] * v[k][2 * i + 2]) % MOD;
}
}
v1[i] = v1[2 * i + 1] * v1[2 * i + 2] % MOD;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> C;
sz = 1;
while (sz < n) sz <<= 1;
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> b[i];
build(0, 0, sz);
cin >> q;
while (q--) {
int idx, a1, b1;
cin >> idx >> a1 >> b1;
idx--;
a[idx] = a1 % MOD;
b[idx] = b1 % MOD;
upd(idx, 0, 0, sz);
int ans = v1[0];
for (int j = 0; j < C; j++) {
ans = (ans - v[j][0] + MOD) % MOD;
}
cout << ans << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |