最纯粹精简直接的一遍处理居然T掉了五个点!气死偶咧!
但是为什么会这样呢?希望有巨佬分析下复杂度。
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
const int MAXN=1e5+5,MOD=998244353;
int N,M,C,V,Q;
ll A[MAXN],add[MAXN],multag=1;
struct func{
int typ,idx;
ll val;
}F[MAXN];
vector<int> G[MAXN];
void solve(int u){
//printf("u=%d,typ=%d,curtag=%lld\n",u,F[u].typ,multag);
if(F[u].typ==1){add[F[u].idx]=(add[F[u].idx]+F[u].val*multag)%MOD;return;}
if(F[u].typ==2){multag=multag*F[u].val%MOD;return;}
for(int i = G[u].size()-1;i >= 0;i--){
int v=G[u][i];
solve(v);
}
}
int main(){
scanf("%d",&N);
for(int i = 1;i <= N;i++)scanf("%lld",&A[i]);
scanf("%d",&M);
for(int i = 1;i <= M;i++){
scanf("%d",&F[i].typ);
if(F[i].typ==1)scanf("%d%lld",&F[i].idx,&F[i].val);
if(F[i].typ==2)scanf("%lld",&F[i].val);
if(F[i].typ==3){
scanf("%d",&C);
for(int j = 1;j <= C;j++)scanf("%d",&V),G[i].push_back(V);
}
}
scanf("%d",&Q);
for(int i = 1;i <= Q;i++)scanf("%d",&V),G[0].push_back(V);
solve(0);
for(int i = 1;i <= N;i++)printf("%lld ",(A[i]*multag+add[i])%MOD);
return 0;
}