제출 #1139441

#제출 시각아이디문제언어결과실행 시간메모리
1139441THXuanRelativnost (COCI15_relativnost)C++20
140 / 140
1536 ms13360 KiB
#include <iostream> #include <vector> #include <algorithm> #include <queue> #include <set> #include <map> #define INF 1e9 typedef long long ll; using namespace std; const int MOD = 10007; const int MAX = 1e5 + 5; int c; int sTree[21][MAX << 2]; int add(int x, int y) { return x + y >= MOD ? (x + y) - MOD : x + y; } int mul(int x, int y) { return x * y % MOD; } void Build(int node, int l, int r, pair<int, int> v[]) { if (l == r) { sTree[1][node] = v[l].first % MOD; sTree[0][node] = v[l].second % MOD; } else { int mid = (l + r) >> 1; Build(node << 1, l, mid, v); Build(node << 1 | 1, mid + 1, r, v); for (int i = 0; i <= c; ++i) { sTree[i][node] = 0; } for (int i = 0; i <= c; ++i) { for (int j = 0; j <= c; ++j) { sTree[min(i + j, c)][node] = add(sTree[min(i + j, c)][node], mul(sTree[i][node << 1], sTree[j][node << 1 | 1])); } } } } void Update(int node, int l, int r, int pos, pair<int, int>& val) { if (l == r) { sTree[1][node] = val.first % MOD; sTree[0][node] = val.second % MOD; } else { int mid = (l + r) >> 1; if (pos <= mid) { Update(node << 1, l, mid, pos, val); } else { Update(node << 1 | 1, mid + 1, r, pos, val); } for (int i = 0; i <= c; ++i) { sTree[i][node] = 0; } for (int i = 0; i <= c; ++i) { for (int j = 0; j <= c; ++j) { sTree[min(i + j, c)][node] = add(sTree[min(i + j, c)][node], mul(sTree[i][node << 1], sTree[j][node << 1 | 1])); } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n >> c; pair<int, int> v[n + 1]; for (int i = 1; i <= n; ++i) { cin >> v[i].first; } for (int i = 1; i <= n; ++i) { cin >> v[i].second; } Build(1, 1, n, v); int q; cin >> q; while (q--) { int indx, f, s; cin >> indx >> f >> s; pair<int, int>p = { f, s }; Update(1, 1, n, indx, p); int res = sTree[c][1]; cout << res << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...