Submission #556012

#TimeUsernameProblemLanguageResultExecution timeMemory
556012600MihneaSprinkler (JOI22_sprinkler)C++17
0 / 100
4038 ms112368 KiB
#include <bits/stdc++.h> bool home = 1; using namespace std; typedef long long ll; const int N=200000+7; const int K=20; int n; int q; int mod; int mod_phi; int h[N]; vector<int> g[N]; pair<int, int> rmq[K][2*N]; int lg[2*N]; int par[N]; int dep[N]; int first_euler[N]; int last_euler[N]; vector<int> la[N]; int top; int verts[N]; int pos[N]; void build(int a,int p=-1){ par[a]=p; la[dep[a]].push_back(a); rmq[0][++top]={dep[a], a}; first_euler[a]=last_euler[a]=top; for(auto&b:g[a]){ if(b==p) continue; dep[b]=1+dep[a]; build(b,a); rmq[0][++top]={dep[a], a}; last_euler[a]=top; } } int get_lca(int a,int b){ if(first_euler[a]>last_euler[b]) swap(a,b); a=first_euler[a]; b=last_euler[b]; assert(a<=b); int k=lg[b-a+1]; return min(rmq[k][a],rmq[k][b-(1<<k)+1]).second; } int get_dist(int a,int b){ int c=get_lca(a,b); return dep[a]+dep[b]-2*dep[c]; } int cnt_at_dep_before(int dep,int when) { int low=0,high=(int)la[dep].size()-1,sol=0; while(low<=high){ int mid=(low+high)/2; if(first_euler[la[dep][mid]]<=when){ sol=mid+1; low=mid+1; }else{ high=mid-1; } } return sol; } int delta[N]; vector<pair<int, int>> factorize(int n){ vector<pair<int, int>> sol; for(int d=2;d*d<=n;d++){ int e=0; while(n%d==0) n/=d, e++; if(e) sol.push_back({d, e}); } if(n>1){ sol.push_back({n, 1}); } return sol; } int pwmod(int a,int b){ assert(0<=a&&a<mod); int r=1; while (b) { if (b&1) r=r*(ll)a%mod; a=a*(ll)a%mod; b/=2; } return r; } int y; const int MX=2; int e[N][MX+1][11]; int ww[N][MX+1]; int t[MX+1]; int tinv[MX+1]; signed main() { #ifdef ONLINE_JUDGE home = 0; #endif for(int i=0;i<N;i++) { for(int j=0;j<=MX;j++){ ww[i][j]=1; } } home=0; if (home) { freopen("I_am_iron_man2", "r", stdin); } else { ios::sync_with_stdio(0); cin.tie(0); } cin>>n>>mod; vector<pair<int, int>> mod_factors=factorize(mod); mod_phi=mod; for (auto &it:mod_factors){ if(mod_phi%it.first==0) mod_phi/=it.first, mod_phi*=(it.first-1); } y=(int)mod_factors.size(); for (int i=1;i<n;i++) { int a, b; cin>>a>>b; g[a].push_back(b); g[b].push_back(a); } build(1); for(int i=2;i<=top;i++) lg[i]=1+lg[i/2]; for (int k=1;(1<<k)<=top;k++) { for(int i=1;i+(1<<k)-1<=top;i++){ rmq[k][i]=min(rmq[k-1][i],rmq[k-1][i+(1<<(k-1))]); } } { top=0; for (int d=0;d<=n;d++){ delta[d]=top; for(auto &i:la[d]){ verts[++top]=i; pos[i]=top; } } assert(top==n); } for (int i=1;i<=n;i++) { cin>>h[pos[i]]; } cin>>q; /// q=4; for(int iq=1;iq<=q;iq++){ /**if(iq%1000==0) { cout<<"done "<<iq<<"\n"; }**/ int type; cin>>type; assert(type==1||type==2); if(type==1){ int x,d,w; cin>>x>>d>>w; vector<int> cnt_divi_w(y); for (int i=0;i<y;i++){ while(w%mod_factors[i].first==0) { w/=mod_factors[i].first; cnt_divi_w[i]++; } } int winv=pwmod(w,mod_phi-1); assert(w*(ll)winv%mod==1); for (int i=0;i<y;i++){ t[i]=cnt_divi_w[i]; tinv[i]=-cnt_divi_w[i]; } int vertex=x,ant; while (vertex>=1&&d>=0) { ww[vertex][d]=ww[vertex][d]*(ll)w%mod; for(int i=0;i<y;i++) e[vertex][d][i]+=t[i]; if(vertex!=x){ if (d-1>=0){ ww[ant][d-1]=ww[ant][d-1]*(ll)winv%mod; for(int i=0;i<y;i++) e[ant][d-1][i]+=tinv[i]; } } ant=vertex; vertex=par[vertex]; d--; } }else{ int x,xinit; cin>>x; xinit=x; int w=1; for(int i=0;i<y;i++){ t[i]=0; } int cur_dist=0; while (x>=1&&cur_dist<=MX){ for (int i=cur_dist;i<=MX;i++){ w=w*(ll)ww[x][i]%mod; for(int j=0;j<y;j++){ t[j]+=e[x][i][j]; } } x=par[x]; cur_dist++; } x=xinit; int sol=h[pos[x]]; sol=sol*(ll)w%mod; for (int i=0;i<y;i++){ if(t[i]) { sol=sol*(ll)pwmod(mod_factors[i].first,t[i])%mod; } } cout<<sol<<"\n"; } } }

Compilation message (stderr)

sprinkler.cpp: In function 'int main()':
sprinkler.cpp:119:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  119 |     freopen("I_am_iron_man2", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sprinkler.cpp:201:25: warning: 'ant' may be used uninitialized in this function [-Wmaybe-uninitialized]
  201 |             ww[ant][d-1]=ww[ant][d-1]*(ll)winv%mod;
      |             ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...