OIerAlbedo @ 2021-03-09 19:28:02
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int INF=998244353;
int cnt,n,m,i,oooo,T;
int a[200000],b[200000],d[200000],f[200000],opt[200000],u[200000],f4[3000000];
unsigned long long f1[1000000],p1[1000000],p2[1000000],c[1000000],e[1000000],f3[1000000];
unsigned long long kk,x,pp,fa;
void add(int x,int y)
{
cnt++;a[cnt]=y;b[cnt]=d[x];d[x]=cnt;f[y]++;
}
void sc1(int x,int fa)
{
if (opt[x]==2) f1[x]=p2[x];else f1[x]=1;
for (int i=d[x];i;i=b[i])
{
if (a[i]!=fa)
{
sc1(a[i],x);
f1[x]=(f1[x]*f1[a[i]]) % INF;
}
}
}
/* void sc2(int x,int fa)
{
long long kk=1;
int t=1,w=1;
f4[1]=i;
while (t<=w)
{
kk=1;
for (i=d[f4[t]];i;i=b[i])
{
f3[a[i]]=(f3[a[i]]+f3[f4[t]]*kk) % INF;
kk=(kk*f1[a[i]]) % INF;
f[a[i]]--;
if (f[a[i]]==0)
{
w++;f4[w]=a[i];
}
}
t++;
}
for (int i=d[x];i;i=b[i])
{
if (a[i]!=fa)
{
if (x==2) cout<<f3
f3[a[i]]=(f3[a[i]]+f3[x]*kk) % INF;
kk=(kk*f1[a[i]]) % INF;
sc2(a[i],x);
}
}
} */
int main()
{
ios::sync_with_stdio(0);cin.tie();cout.tie();
cin>>n;
for (i=1;i<=n;i++) cin>>e[i];
cin>>m;
for (i=1;i<=m;i++)
{
cin>>opt[i];
if (opt[i]==1) cin>>p1[i]>>p2[i];
else if (opt[i]==2) cin>>p2[i];
else
{
int oooo;
cin>>oooo;
while (oooo) { cin>>x;add(i,x);oooo--;}
}
}
for (i=1;i<=n;i++)
if (f[i]==0)
sc1(i,0);
cin>>T;
for (i=1;i<=T;i++) cin>>u[i];
pp=1;
for (i=T;i>=1;i--)
{
x=u[i];f3[x]=(f3[x]+pp) % INF;
pp=(pp*f1[x]) % INF;
}
int t=1,w=1;
for (i=1;i<=n;i++)
{
if (f[i]==0)
{
w++;f4[w]=i;
}
}
kk=1;
while (t<=w)
{
kk=1;
for (i=d[f4[t]];i;i=b[i])
{
f3[a[i]]=(f3[a[i]]+f3[f4[t]]*kk) % INF;
kk=(kk*f1[a[i]]) % INF;
f[a[i]]--;
if (f[a[i]]==0)
{
w++;f4[w]=a[i];
}
}
t++;
}
for (i=1;i<=n;i++) e[i]=(e[i]*pp) % INF;
for (i=1;i<=m;i++)
if (opt[i]==1)
e[p1[i]]=(e[p1[i]]+f3[i]*p2[i] % INF) % INF;
for (i=1;i<=n;i++) cout<<e[i]<<" ";
return 0;
}
为什么会WA