#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#define INF 1e9
typedef long long ll;
using namespace std;
int n = 0, c = 0;
const ll MOD = 1e4 + 7;
ll dp[400005][21];
void build(int v, int l, int r, vector<ll>&a, vector<ll>&b) {
if (l == r) {
dp[v][0] = b[l] % MOD;
dp[v][1] = a[l] % MOD;
return;
}
int mid = (l + r) / 2;
build(2 * v, l, mid, a, b);
build(2 * v + 1, mid + 1, r,a, b);
for (int i = 0; i <= c; i++)dp[v][i] = 0;
for (int i = 0; i <= c; i++) {
for (int j = 0; j <= c; j++) {
dp[v][min(i + j, c)] = (dp[v][min(i + j, c)] + dp[2 * v][i] * dp[2 * v + 1][j]) % MOD;
}
}
}
void update(int v, int l, int r, int k, vector<ll>&a, vector<ll>&b) {
if (l == r) {
dp[v][0] = b[l] % MOD;
dp[v][1] = a[l] % MOD;
return;
}
int mid = (l + r) / 2;
if (k <= mid) {
update(2 * v, l, mid, k, a, b);
}
else {
update(2 * v + 1, mid + 1, r, k, a, b);
}
for (int i = 0; i <= c; i++)dp[v][i] = 0;
for (int i = 0; i <= c; i++) {
for (int j = 0; j <= c; j++) {
dp[v][min(i + j, c)] = (dp[v][min(i + j, c)] + dp[2 * v][i] * dp[2 * v + 1][j]) % MOD;
}
}
}
void solve()
{
cin >> n >> c;
vector<ll>a(n + 1), b(n + 1);
for (int i = 1; i <= n; i++)cin >> a[i];
for (int i = 1; i <= n; i++)cin >> b[i];
build(1, 1, n, a, b);
int q; cin >> q;
while (q--) {
ll p, A, B; cin >> p >> A >> B;
a[p] = A; b[p] = B;
update(1, 1, n, p, a, b);
cout << dp[1][c] << "\n";
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = 1;// cin >> t;
while (t--) solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |