제출 #898584

#제출 시각아이디문제언어결과실행 시간메모리
898584alexander707070Sprinkler (JOI22_sprinkler)C++14
3 / 100
4070 ms288680 KiB
#include<bits/stdc++.h>
#define MAXN 200007
using namespace std;

int n,q,type;
long long mod,w;
int a,b,s,d;
vector<int> v[MAXN];
int num[MAXN],tt,from[MAXN],to[MAXN],parent[MAXN];

long long tree[42][4*MAXN],val[MAXN];

void dfs(int x,int p){
    from[x]=n; to[x]=0;
    parent[x]=p;

    for(int i=0;i<v[x].size();i++){
        if(v[x][i]==p)continue;

        tt++; num[v[x][i]]=tt;
        from[x]=min(from[x],tt);
        to[x]=max(to[x],tt);
    }

    for(int i=0;i<v[x].size();i++){
        if(v[x][i]==p)continue;
        dfs(v[x][i],x);
    }
}

void update(int id,int v,int l,int r,int ll,int rr,long long val){
    if(ll>rr)return;
    if(l==ll and r==rr){
        tree[id][v]*=val; tree[id][v]%=mod;
    }else{
        int tt=(l+r)/2;
        update(id,2*v,l,tt,ll,min(tt,rr),val);
        update(id,2*v+1,tt+1,r,max(tt+1,ll),rr,val);
    }
}

long long getval(int id,int v,int l,int r,int pos){
    if(l==r)return tree[id][v];
    
    int tt=(l+r)/2;
    if(pos<=tt)return (getval(id,2*v,l,tt,pos) * tree[id][v])%mod;
    return (getval(id,2*v+1,tt+1,r,pos) * tree[id][v])%mod;
}

void query(int x,int dist,int ban,long long mult){
    if(x==0)return;
    val[x]*=mult; val[x]%=mod;
    if(dist==0)return;

    if(ban>=from[x] and ban<=to[x]){
        update(dist-1,1,1,n,from[x],ban-1,mult);
        update(dist-1,1,1,n,ban+1,to[x],mult);
    }else{
        update(dist-1,1,1,n,from[x],to[x],mult);
    }

    query(parent[x],dist-1,num[x],mult);
}

long long geth(int x,int dist){
    if(x==0 or dist>40)return 1;

    long long res=1;
    for(int i=dist;i<=40;i++){
        res*=getval(i,1,1,n,num[x]);
        res%=mod;
    }

    return (res*geth(parent[x],dist+1))%mod;
}

int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>mod;
    for(int i=1;i<=n-1;i++){
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    for(int i=0;i<=40;i++){
        for(int f=1;f<=4*n;f++){
            tree[i][f]=1;
        }
    }

    num[1]=1; tt=1;
    dfs(1,0);

    for(int i=1;i<=n;i++){
        cin>>val[i];
    }

    cin>>q;
    for(int i=1;i<=q;i++){
        cin>>type;
        if(type==1){
            cin>>s>>d>>w;
            query(s,d,0,w);
        }else{
            cin>>s;
            cout<<( val[s]*geth(s,0) )%mod<<"\n";
        }
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

sprinkler.cpp: In function 'void dfs(int, int)':
sprinkler.cpp:17:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
sprinkler.cpp:25:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   25 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...