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 105 106 107 108
| #include <bits/stdc++.h>
#define fi first #define se second #define pb push_back #define MP std::make_pair #define PII std::pair<int, int> #define all(x) (x).begin(), (x).end() #define CL(a, b) memset(a, b, sizeof a) #define rep(i, l, r) for (int i = (l); i <= (r); ++ i) #define per(i, r, l) for (int i = (r); i >= (l); -- i) #define PE(x, a) for (int x = head[a]; x;x = edge[x].next)
typedef long long ll;
template <class T> inline void rd(T &x) { char c = getchar(), f = 0; x = 0; while (!isdigit(c)) f = (c == '-'), c = getchar(); while (isdigit(c)) x = x * 10 + c - '0', c = getchar(); x = f ? -x : x; }
#define int long long
const int MAXN = 1e6 + 7; const int HA = 998244353;
int n, m, k; int a[MAXN], pos[MAXN], type[MAXN], val[MAXN], deg[MAXN], coe[MAXN], opt[MAXN], cc[MAXN];
struct Edge { int t, next; } edge[MAXN];
int head[MAXN], cnt;
void add(int &x, const int &y) { x += y - HA; x += x >> 31 & HA; }
void Add(int u, int v) { edge[++cnt] = (Edge){v, head[u]}; head[u] = cnt; }
void init(int u) { if (~coe[u]) return; coe[u] = 1; if (type[u] == 1) return; if (type[u] == 2) { coe[u] = val[u]; return; } PE(e, u) { int v = edge[e].t; init(v); coe[u] = 1ll * coe[u] * coe[v] % HA; } }
signed main() { rd(n); rep(i, 1, n) rd(a[i]); rd(m); rep(i, 1, m) { rd(type[i]); if (type[i] == 1) rd(pos[i]), rd(val[i]); else if (type[i] == 2) rd(val[i]); else { int num, x; rd(num); while (num--) { rd(x); Add(i, x); deg[x]++; } } }
CL(coe, -1); rep(i, 1, m) init(i);
rd(k); rep(i, 1, k) rd(opt[i]);
int v = 1;
per(i, k, 1) { int x = opt[i]; if (type[x] == 1) add(cc[x], v); else if (type[x] == 2) v = 1ll * v * val[x] % HA; else { add(cc[x], v); v = 1ll * v * coe[x] % HA; } } rep(i, 1, n) a[i] = 1ll * a[i] * v % HA;
std::queue<int> q; rep(i, 1, m) if (!deg[i]) q.push(i); while (!q.empty()) { int u = q.front(); q.pop(); if (type[u] == 1) {add(a[pos[u]], 1ll * val[u] * cc[u] % HA); continue; } if (type[u] == 2) continue; int c = 1; PE(e, u) { int to = edge[e].t; add(cc[to], 1ll * cc[u] * c % HA); if (!--deg[to]) q.push(to); c = 1ll * c * coe[to] % HA; } } rep(i, 1, n) printf("%lld ", a[i]); puts(""); return 0; }
|