具体题解请参考《NHOI2016简单分析》,程序如下:
# include <algorithm>
# include <cstring>
# include <cstdio>
using namespace std;
const int MAXN = 100010;
const int MAXC = 25;
const int MOD = 10007;
int T[MAXN*2][MAXC];
int a[MAXN];
int b[MAXN];
int n;
int c;
void push_up(int x){
memset(T[x],0,sizeof(T[x]));
for (int i=0;i<=c;++i){
for (int j=0;j<=c;++j){
T[x][min(i+j,c)] = (T[x][min(i+j,c)] + T[x<<1][i] * T[(x<<1)+1][j]) % MOD;
}
}
}
void change(int p){
p += n;
memset(T[p],0,sizeof(T[p]));
T[p][1] = a[p-n] % MOD;
T[p][0] = b[p-n] % MOD;
for(p >>= 1;p > 0; p >>= 1){
push_up(p);
}
}
int q;
int main() {
freopen("fas.in","r",stdin);
freopen("fas.out","w",stdout);
scanf("%d%d", &n, &c);
for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
for (int i = 0; i < n; ++i) scanf("%d", &b[i]);
for (int i = 0; i < n; ++i) {
T[i + n][0] = b[i] % MOD;
T[i + n][1] = a[i] % MOD;
}
for (int i = n-1; i >= 1; --i)
push_up(i);
scanf("%d", &q);
for (int i = 0; i < q; ++i) {
int p;
scanf("%d", &p); --p;
scanf("%d%d", &a[p], &b[p]);
change(p);
printf("%d\n", T[1][c]);
}
return 0;
}