1
0

洛谷-P7077.cpp 1.4 KB

12345
  1. #include <iostream>
  2. #include <queue>
  3. #include <vector>
  4. using namespace std;constexpr long long MOD=998244353;struct Function{int type=3,pos=0;long long value=1;vector<int>calls;};
  5. int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin>>n;vector<long long>a(n);for(auto&x:a)cin>>x;int m;cin>>m;vector<Function>f(m+1);vector<int>indegree(m+1);for(int i=0;i<m;++i){cin>>f[i].type;if(f[i].type==1){cin>>f[i].pos>>f[i].value;--f[i].pos;}else if(f[i].type==2)cin>>f[i].value;else{int c;cin>>c;f[i].calls.resize(c);for(int&x:f[i].calls){cin>>x;--x;++indegree[x];}}}int q;cin>>q;f[m].calls.resize(q);for(int&x:f[m].calls){cin>>x;--x;++indegree[x];}queue<int>que;for(int i=0;i<=m;++i)if(indegree[i]==0)que.push(i);vector<int>topo;while(!que.empty()){int u=que.front();que.pop();topo.push_back(u);for(int v:f[u].calls)if(--indegree[v]==0)que.push(v);}vector<long long>mul(m+1,1);for(auto it=topo.rbegin();it!=topo.rend();++it){int u=*it;if(f[u].type==2)mul[u]=f[u].value%MOD;else if(f[u].type==3)for(int v:f[u].calls)mul[u]=mul[u]*mul[v]%MOD;}vector<long long>coef(m+1);coef[m]=1;for(int u:topo)if(f[u].type==3){long long suffix=1;for(auto it=f[u].calls.rbegin();it!=f[u].calls.rend();++it){int v=*it;coef[v]=(coef[v]+coef[u]*suffix)%MOD;suffix=suffix*mul[v]%MOD;}}for(auto&x:a)x=x*mul[m]%MOD;for(int i=0;i<m;++i)if(f[i].type==1)a[f[i].pos]=(a[f[i].pos]+coef[i]*f[i].value)%MOD;for(long long x:a)cout<<x<<' ';cout<<'\n';}