Submission #589272

#TimeUsernameProblemLanguageResultExecution timeMemory
589272TekorSprinkler (JOI22_sprinkler)C++17
41 / 100
4067 ms110800 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define ll long long #define f first #define s second #define pii pair <int,int> #define en '\n' #define all(v) v.begin(),v.end() void boos() { ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0); } const int N = 4e5 + 100; const int bl = 400; vector <int> g[N]; ll a[N],L; int h[N],tin[N],tout[N],Tima,pr[N],mxh; int n,k[N]; vector <ll> t[N],t1[N]; vector <int> q[N]; void dfs_build(int v,int p) { tin[v] = ++Tima; q[h[v]].pb(tin[v]); for(auto to : g[v]) { if(to == p)continue; h[to] = h[v] + 1; pr[to] = v; dfs_build(to,v); } tout[v] = Tima; } void push(int d,int v) { t[d][v + v] = (t[d][v + v] * t1[d][v]) % L; t[d][v + v + 1] = (t[d][v + v + 1] * t1[d][v]) % L; t1[d][v + v] = (t1[d][v + v] * t1[d][v]) % L; t1[d][v + v + 1] = (t1[d][v + v + 1] * t1[d][v]) % L; t1[d][v] = 1; } void upd(int d,int v,int tl,int tr,int l,int r,ll x) { if(q[d][tl] > r || q[d][tr] < l)return; if(q[d][tl] >= l && q[d][tr] <= r) { t1[d][v] = (t1[d][v] * x) % L; t[d][v] = (t[d][v] * x) % L; return; } push(d,v); int tm = (tl + tr) / 2; upd(d,v + v,tl,tm,l,r,x); upd(d,v + v + 1,tm + 1,tr,l,r,x); } ll get(int d,int v,int tl,int tr,int pos) { //cout << v << " " << tl << " " << tr << endl; if(tl == tr)return t[d][v]; push(d,v); int tm = (tl + tr) / 2; if(q[d][tm] >= pos)return get(d,v + v,tl,tm,pos); else return get(d,v + v + 1,tm + 1,tr,pos); } void build() { for(int i = 1;i <= n;i++) { if(q[i].empty())break; k[i] = q[i].size(); q[i].pb(0); sort(all(q[i])); for(int j = 0;j <= 4 * k[i];j++) { t[i].pb(1); t1[i].pb(1); } mxh = i; } } void add(int x,int dist,ll w) { int v = x; int tek = 0; while(tek <= dist) { int need = h[v] + dist - tek; if(need <= mxh)upd(need,1,1,k[need],tin[v],tout[v],w); if(x == 4) { //cout << need << " "; } if(dist - tek > 0 && pr[v] != -1) { need--; //cout << need << " "; if(need <= mxh)upd(need,1,1,k[need],tin[v],tout[v],w); } if(pr[v] != -1)v = pr[v]; tek++; } } ll getans(int pos) { //cout << h[pos] << " " << k[h[pos]] << endl; ll val = get(h[pos],1,1,k[h[pos]],tin[pos]); //cout << val << endl; return (val * a[pos]) % L; } void solve() { cin >> n >> L; for(int i = 1;i <= n;i++) { pr[i] = -1; } for(int i = 1;i < n;i++) { int x,y; cin >> x >> y; g[x].pb(y); g[y].pb(x); } for(int i = 1;i <= n;i++)cin >> a[i]; h[1] = 1; dfs_build(1,-1); build(); int m; cin >> m; for(int i = 1;i <= m;i++) { int typ; cin >> typ; if(typ == 1) { int x,dist; ll w; cin >> x >> dist >> w; add(x,dist,w); }else { int x; cin >> x; cout << getans(x) << en; } } } int main() { boos(); int ttt; ttt = 1; while(ttt--) { solve(); } }
#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...