// dp[i][j] = the number of ways if consider the first i people and j people get colored paintings
/*
* transition
* dp[i][j] = ((dp[i-1][j-1] * a[i]) +(dp[i-1][j]* b[i])) % MOD;
*/
#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 = 10007;
ll a[100005], b[100005], dp[100005][25];
void memo(int v)
{
    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 build(int v, int l, int r) {
    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);
    build(2 * v + 1, mid + 1, r);
    memo(v);
}
void update(int v, int l, int r, int k) {
    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);
    else update(2 * v + 1, mid + 1, r, k);
    memo(v);
}
void solve()
{
    cin >> n >> c;
    for (int i = 1; i <= n; i++)cin >> a[i];
    for (int i = 1; i <= n; i++)cin >> b[i];
    build(1, 1, n);
    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);
        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... |