zhang_fengrui @ 2024-03-30 17:47:25
#include <cstdio>
#include <queue>
#define int long long
#define mod 998244353
using namespace std;
int n,m;
int a[100005];
struct Edge{
int next;
int to;
}es[1000005],es1[1000005];
int head[100005],cnt;
int head1[100005],cnt1;
int in[100005];
int in1[100005],in2[100005];
int cs[100005];
void add(int u,int v){
es[cnt].next=head[u];
es[cnt].to=v;
in[v]++;
head[u]=cnt;
cnt++;
}
void add1(int u,int v){
es1[cnt1].next=head1[u];
es1[cnt1].to=v;
in2[v]++;
head1[u]=cnt1;
cnt1++;
}
int hmul[100005];
pair<int,int> hplu[100005];
int mul[100005];
void tuopu1(){
queue<int> q;
for(int i=1;i<=m+1;i++){
in1[i]=in[i];
if(in1[i]==0){
q.push(i);
}
}
while(!q.empty()){
int u=q.front();
q.pop();
mul[u]*=hmul[u];
mul[u]%=mod;
//printf("u:%d mul[u]:%d\n",u,mul[u]);
for(int i=head[u];i;i=es[i].next){
int v=es[i].to;
mul[v]*=mul[u];
mul[v]%=mod;
in1[v]--;
if(in1[v]==0){
q.push(v);
}
}
}
}
void tuopu2(){
queue<int> q;
for(int i=1;i<=m+1;i++){
in1[i]=in2[i];
if(in1[i]==0){
cs[i]++;
q.push(i);
}
}
while(!q.empty()){
int u=q.front();
//printf("u:%d cs[u]:%d\n",u,cs[u]);
q.pop();
int now_mul=1;
for(int i=head1[u];i;i=es1[i].next){
int v=es1[i].to;
in1[v]--;
cs[v]= (cs[v]+cs[u]*now_mul)%mod;
cs[v]%=mod;
now_mul*=mul[v];
now_mul%=mod;
//printf("v:%d in1[v]:%d\n",v,in1[v]);
if(in1[v]==0){
q.push(v);
}
}
}
}
signed main(){
mul[0] = 1;
cnt=1;
cnt1=1;
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
scanf("%lld",&m);
for(int i=1;i<=m;i++){
hmul[i]=1;
mul[i]=1;
int t;
scanf("%lld",&t);
if(t==1){
int p,v;
scanf("%lld%lld",&p,&v);
hplu[i].first=p;
hplu[i].second=v;
}
else if(t==2){
int v;
scanf("%lld",&v);
hmul[i]=v;
}
else{
int c;
scanf("%lld",&c);
for(int j=1;j<=c;j++){
int u;
scanf("%lld",&u);
add(u,i);
add1(i,u);
}
}
}
hmul[m+1]=1;
mul[m+1]=1;
int Q;
scanf("%lld",&Q);
for(int j=1;j<=Q;j++){
int u;
scanf("%lld",&u);
add(u,m+1);
add1(m+1,u);
}
tuopu1();
tuopu2();
//printf("mul[m+1]:%d\n",mul[m+1]);
for(int i=1;i<=n;i++){
a[i]*=mul[m+1];
a[i]%=mod;
}
for(int i=1;i<=m;i++){
//printf("i:%d cs[i]:%d\n",i,cs[i]);
a[hplu[i].first]= (a[hplu[i].first]+cs[i]*hplu[i].second)%mod;
a[hplu[i].first]%=mod;
}
for(int i=1;i<=n;i++){
printf("%lld ",a[i]);
}
return 0;
}