#include <iostream> #include <string> #include <cstring> #include <algorithm> #include <cstdio> #include <vector> #include <queue> #include <climits> #include <stack> #include <map> #include <cmath> #include <set> using namespace std; typedef long long ll; const int mod=23333,maxn=1e5+5; int in[maxn],out[maxn],w[maxn],a[maxn],head[maxn]; struct node{ int next,to; }e[maxn<<2]; int ttime,tot; ll sum[maxn<<2],tag[maxn<<2],tsum[maxn<<2]; #define lson rt<<1 #define rson rt<<1|1 template<class T> void read(T &x){ ll f=1; x=0; char c=getchar(); while(!isdigit(c)){ f=-1; c=getchar(); } while(isdigit(c)){ x=x*10+c-48; c=getchar(); } x*=f; } template<class T> void write(T x){ if(x<0){ putchar('-'); x=-x; } if(x>9){ write(x/10); } putchar(x%10+'0'); } #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); void add(int x,int y){ e[++tot].to=y; e[tot].next=head[x]; head[x]=tot; } void dfs(int u,int fa){ in[u]=++ttime; w[ttime]=a[u]; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(v==fa)continue; dfs(v,u); } out[u]=ttime; } void pushup(ll rt){ sum[rt]=(sum[lson]+sum[rson])%mod; tsum[rt]=(tsum[lson]+tsum[rson])%mod; } void pushdown(ll rt, ll l ,ll r){ if(!tag[rt])return ; ll mid=(l+r)>>1; tsum[lson]+=(mid-l+1)*tag[rt]*tag[rt]%mod+2*tag[rt]*tsum[lson]; tsum[rson]+=(r-mid)*tag[rt]*tag[rt]%mod+2*tag[rt]*tsum[rson]; sum[lson]+=(mid-l+1)*tag[rt]; sum[rson]+=(r-mid)*tag[rt]; tag[lson]+=tag[rt]; tag[rson]+=tag[rt]; sum[rson]%=mod; tsum[rson]%=mod; sum[lson]%=mod; tsum[lson]%=mod; tag[rt]=0; tag[lson]%=mod; tag[rson]%=mod; } void build(ll rt, ll l ,ll r){ tag[rt]=0; if(l==r){ sum[rt]=w[l]%mod; tsum[rt]=w[l]*w[l]%mod; return ; } ll mid=(l+r)>>1; build(lson,l,mid); build(rson,mid+1,r); pushup(rt); } void update(ll ql,ll qr,ll rt,ll l ,ll r,ll k){ if(ql<=l&&r<=qr){ tag[rt]+=k; tsum[rt]+=(r-l+1)*k*k+2*k*sum[rt]; sum[rt]+=(r-l+1)*k; sum[rt]%=mod; tsum[rt]%=mod; tag[rt]%=mod; return ; } pushdown(rt,l,r); ll mid=(l+r)>>1; if(ql<=mid) update(ql,qr,lson,l,mid,k); if(qr>mid) update(ql,qr,rson,mid+1,r,k); pushup(rt); } ll query(ll ql,ll qr,ll rt,ll l,ll r){ if(ql>l||qr<r)return 0; if(ql<=l&&r<=qr){ return tsum[rt]%mod; } ll ans=0,mid=(l+r)>>1; pushdown(rt,l,r); if(ql<=mid){ ans+=query(ql,qr,lson,l,mid); ans%=mod; } if(mid<qr){ ans+=query(ql,qr,rson,mid+1,r); ans%=mod; } return ans%mod; } int main() { ll n,m; ll x,y; read(n),read(m); for(int i=1;i<=n;i++){ read(a[i]); } for(int i=1;i<n;i++){ read(x); read(y); add(x,y); add(y,x); } dfs(1,0); build(1,1,n); while(m--){ int a; ll b,c; read(a); if(a==1){ read(b); read(c); update(in[b],out[b],1,1,n,c); } else { read(b); printf("%lld\n",query(in[b],out[b],1,1,n)); } } return 0; }
全部评论
(0) 回帖