清平乐 @ 2020-11-16 17:02:32
打的暴力,把数组开到1e6就多了20pts,不应该1e5就好了吗
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,N=1e5+5;
int n,m,q,f,tot;
int a[N],T[N],p[N],v[N],c[N];
vector<int>g[N];
struct node{
int l,r,val,mul;
}t[N<<2];
void build(int u,int l,int r)
{
t[u].l=l,t[u].r=r,t[u].mul=1;
if(l==r) return t[u].val=a[l],void();
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
}
void update(int u,int x,int c)
{
if(t[u].mul!=1)
{
t[u<<1].mul=1ll*t[u].mul*t[u<<1].mul%mod;
t[u<<1|1].mul=1ll*t[u].mul*t[u<<1|1].mul%mod;
t[u<<1].val=1ll*t[u].mul*t[u<<1].val%mod;
t[u<<1|1].val=1ll*t[u].mul*t[u<<1|1].val%mod;
t[u].mul=1;
}
if(t[u].l==t[u].r) return t[u].val=(t[u].val+c)%mod,void();
int mid=t[u].l+t[u].r>>1;
if(x<=mid) update(u<<1,x,c);
else update(u<<1|1,x,c);
}
void pushdown(int u)
{
if(t[u].mul!=1)
{
t[u<<1].mul=1ll*t[u].mul*t[u<<1].mul%mod;
t[u<<1|1].mul=1ll*t[u].mul*t[u<<1|1].mul%mod;
t[u<<1].val=1ll*t[u].mul*t[u<<1].val%mod;
t[u<<1|1].val=1ll*t[u].mul*t[u<<1|1].val%mod;
t[u].mul=1;
}
if(t[u].l==t[u].r) return printf("%d ",t[u].val),void();
pushdown(u<<1),pushdown(u<<1|1);
}
void solve(int x)
{
for(register int i=0;i<c[x];++i)
if(T[g[x][i]]==1) update(1,p[g[x][i]],v[g[x][i]]);
else if(T[g[x][i]]==2) t[1].mul=1ll*t[1].mul*v[g[x][i]]%mod;
else solve(g[x][i]);
}
int main(void)
{
//freopen("call.in","r",stdin);
//freopen("call.out","w",stdout);
scanf("%d",&n);
for(register int i=1;i<=n;++i)
scanf("%d",a+i);
build(1,1,n);
scanf("%d",&m);
for(register int i=1;i<=m;++i)
{
scanf("%d",T+i);
if(T[i]==1) scanf("%d%d",p+i,v+i);
else if(T[i]==2) scanf("%d",v+i);
else
{
scanf("%d",c+i);
g[i].resize(c[i]);
for(register int j=0;j<c[i];++j)
scanf("%d",&g[i][j]);
}
}
scanf("%d",&q);
while(q--)
{
scanf("%d",&f);
if(T[f]==1) update(1,p[f],v[f]);
else if(T[f]==2) t[1].mul=1ll*t[1].mul*v[f]%mod;
else solve(f);
}
pushdown(1);
return 0;
}
by lemir3 @ 2020-11-16 18:19:33
最后一层调用的问题,传标记应该在判return的下面,线下解决了别回了