# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
547314 | ToroTN | Sprinkler (JOI22_sprinkler) | C++14 | 1043 ms | 87360 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
int n,l,u_i,v_i,h[200005],t,op,x,d,w,u,p[200005],arr[45],ed,kk,bruh;
int prime[200005],phi;
long long power[35],inv,cnt,dp[200005][45];
vector<int> v[200005],g;
queue<int> q;
int main()
{
scanf("%d%d",&n,&l);
bruh=l;
phi=l;
for(int i=2;i<=100000;i++)
{
prime[i]=1;
}
for(int i=2;i<=100000;i++)
{
if(prime[i]==1)
{
for(int j=2;i*j<=100000;j++)
{
prime[i*j]=0;
}
}
}
for(int i=2;i<=100000;i++)
{
if(prime[i]==1)
{
if(l%i==0)
{
phi/=i;
phi*=(i-1);
while(1)
{
if(bruh%i==0)
{
bruh/=i;
}else
{
break;
}
}
}
}
}
if(bruh!=1)
{
phi/=bruh;
phi*=(bruh-1);
}
u=phi-1;
for(int i=0;i<=30;i++)
{
g.push_back(u%2);
u/=2;
}
for(int i=1;i<n;i++)
{
scanf("%d%d",&u_i,&v_i);
v[u_i].push_back(v_i);
v[v_i].push_back(u_i);
}
memset(p,-1,sizeof p);
p[1]=0;
q.push(1);
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=0;i<v[u].size();i++)
{
if(p[v[u][i]]==-1)
{
p[v[u][i]]=u;
q.push(v[u][i]);
}
}
}
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=40;j++)
{
dp[i][j]=1;
}
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%d",&x,&d,&w);
power[0]=w;
for(int i=1;i<=30;i++)
{
power[i]=power[i-1]*power[i-1];
power[i]%=l;
}
inv=1;
for(int i=0;i<=30;i++)
{
if(g[i]==1)
{
inv*=power[i];
inv%=l;
}
}
u=x;
for(int i=d;i>=0;i--)
{
arr[i]=u;
ed=i;
u=p[u];
if(u==0)
{
break;
}
}
for(int i=d;i>=ed;i--)
{
/*dp[arr[i]][i]*=w;
dp[arr[i]][i]%=l;
if(i-1>=0&&i+1<=d)
{
dp[arr[i+1]][i-1]*=inv;
dp[arr[i+1]][i-1]%=l;
}*/
if(i!=ed)
{
dp[arr[i]][i]*=w;
dp[arr[i]][i]%=l;
dp[arr[i]][i-1]*=w;
dp[arr[i]][i-1]%=l;
}else
{
for(int j=0;j<=i;j++)
{
dp[arr[i]][j]*=w;
dp[arr[i]][j]%=l;
}
}
}
}else
{
scanf("%d",&x);
u=x;
cnt=h[x];
for(int i=0;i<=40;i++)
{
/*for(int j=i;j<=40;j++)
{
cnt*=dp[u][j];
cnt%=l;
}*/
cnt*=dp[u][i];
cnt%=l;
u=p[u];
if(u==0)
{
break;
}
}
printf("%lld\n",cnt);
}
}
}
/*
4 7
1 2
2 3
3 4
1
1
1
1
11
1 2 1 2
1 1 0 2
2 1
2 2
2 3
2 4
1 4 10 2
2 1
2 2
2 3
2 4
*/
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |