1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| #include <bits/stdc++.h> #define int long long using namespace std;
const int N = 10e5 + 10, M = 998244353; int arr[N], n, m, Q; int flag = 1;
struct Func1 { int p, v; Func1(int p, int v) : p(p), v(v) {} };
struct Func2 { int v; Func2(int v) : v(v) {} };
struct Func3 { vector<int> v; Func3() {} };
vector<Func1> f1; vector<Func2> f2; vector<Func3> f3; int mp[N], md[N];
void calc(int k, int p) { if(k == 1) { Func1 & f = f1[p]; if(f.v % flag == 0) arr[f.p] = (f.v / flag + arr[f.p]) % M; else { for(int i = 1; i <= n; i++) arr[i] = (arr[i] * flag) % M; flag = 1; arr[f.p] = (arr[f.p] + f.v) % M; } } else if(k == 2) flag = (flag * f2[p].v) % M; else { Func3 & f = f3[p]; for(vector<int>::iterator it = f.v.begin(); it != f.v.end(); it++) calc(md[*it], mp[*it]); } }
signed main(void) { scanf("%lld", &n); for (int i = 1; i <= n; i++) scanf("%lld", arr + i);
scanf("%lld", &m); for (int i = 1; i <= m; i++) { scanf("%lld", md + i); if (md[i] == 1) { mp[i] = f1.size(); int p, v; scanf("%lld%lld", &p, &v); f1.push_back(Func1(p, v)); } else if (md[i] == 2) { mp[i] = f2.size(); int v; scanf("%lld", &v); f2.push_back(Func2(v)); } else if (md[i] == 3) { mp[i] = f3.size(); int c, x; scanf("%lld", &c); Func3 tmp; for (int l = 1; l <= c; l++) scanf("%lld", &x), tmp.v.push_back(x); f3.push_back(tmp); } }
Func3 fAns; int Q, x; scanf("%lld", &Q); for(int i = 1; i <= Q; i++) { scanf("%lld", &x); fAns.v.push_back(x); } f3.push_back(fAns); calc(3, f3.size() - 1);
for(int i = 1; i <= n; i++) cout << (flag * arr[i]) % M << " "; }
|