Submission #220238

#TimeUsernameProblemLanguageResultExecution timeMemory
220238Haunted_CppRelativnost (COCI15_relativnost)C++17
140 / 140
3131 ms18552 KiB
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <set> #include <map> #include <unordered_set> #include <unordered_map> #include <queue> #include <cassert> #include <string> #include <cstring> #include <bitset> #include <random> #include <chrono> #include <iomanip> /* #pragma GCC optimize ("Ofast") #pragma GCC target("fma,sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native") #pragma GCC optimize("unroll-loops") */ #define FOR(i, a, b) for(int i = a; i < (int) b; i++) #define F0R(i, a) FOR (i, 0, a) #define ROF(i, a, b) for(int i = a; i >= (int) b; i--) #define R0F(i, a) ROF(i, a, 0) #define GO(i, a) for (auto i : a) #define rsz resize #define eb emplace_back #define pb push_back #define sz(x) (int) x.size() #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define f first #define s second using namespace std; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<pii> vpii; typedef vector<vi> vvi; typedef vector<vpii> vvpii; typedef long long i64; typedef vector<i64> vi64; typedef vector<vi64> vvi64; typedef pair<i64, i64> pi64; typedef vector<pi64> vpi64; const int dr[] = {+1, -1, +0, +0, +1, -1, +1, -1}; const int dc[] = {+0, +0, +1, -1, +1, -1, -1, +1}; const int ms[] = {+31, +29, +31, 30, +31, +30, +31, +31, +30, +31, +30, +31}; const short MOD = 1e4 + 7; const int N = 1e5 + 1; const short C = 21 + 1; short add (short &a, short b) { short res = a + b; while (res >= MOD) res -= MOD; return res; } short mult (short a, short b) { int res = 1 * a * b; if (res >= MOD) res %= MOD; return res; } short sub (short &a, short b) { short res = a - b; while (res < 0) res += MOD; return res; } int n, c; short cor [N], incolor[N]; short seg [4 * N][C]; void build (int l, int r, int node, int where) { if (l == r) { if (where == 0) seg[node][where] = incolor[l]; else if (where == 1) seg[node][where] = cor[l]; else if (where == 21) seg[node][where] = add (incolor[l], cor[l]); else seg[node][where] = 0; } else { int mid = l + (r - l) / 2; build (l, mid, 2 * node + 1, where); build (mid + 1, r, 2 * node + 2, where); if (where == 21) { seg[node][where] = mult (seg[2 * node + 1][where], seg[2 * node + 2][where]); return; } F0R (i, where + 1) { const int L = i; const int R = where - i; seg[node][where] = add (seg[node][where], mult (seg[2 * node + 1][L], seg[2 * node + 2][R])); } } } void update (int l, int r, int node, int where, int delta) { if (l > delta || r < delta) return; if (l == delta && r == delta) { if (where == 0) seg[node][where] = incolor[l]; else if (where == 1) seg[node][where] = cor[l]; else if (where == 21) seg[node][where] = add (incolor[l], cor[l]); else seg[node][where] = 0; return; } int mid = l + (r - l) / 2; update (l, mid, 2 * node + 1, where, delta); update (mid + 1, r, 2 * node + 2, where, delta); if (where == 21) { seg[node][where] = mult (seg[2 * node + 1][where], seg[2 * node + 2][where]); return; } seg[node][where] = 0; F0R (i, where + 1) { const int L = i; const int R = where - i; seg[node][where] = add (seg[node][where], mult (seg[2 * node + 1][L], seg[2 * node + 2][R])); } } int main () { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> c; F0R (i, n) { int foo; cin >> foo; foo %= MOD; cor[i] = foo; } F0R (i, n) { int foo; cin >> foo; foo %= MOD; incolor[i] = foo; } memset (seg, 0, sizeof(seg)); F0R (i, C) build (0, n - 1, 0, i); int q; cin >> q; while (q--) { int cliente, nova_cor, nova_incolor; cin >> cliente >> nova_cor >> nova_incolor; --cliente; cor[cliente] = (nova_cor >= MOD ? nova_cor % MOD : nova_cor); incolor[cliente] = (nova_incolor >= MOD ? nova_incolor % MOD : nova_incolor); F0R (i, C) update (0, n - 1, 0, i, cliente); short res = seg[0][C - 1]; F0R (i, c) res = sub (res, seg[0][i]); cout << res << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...