Submission #1209085

#TimeUsernameProblemLanguageResultExecution timeMemory
1209085aaron_dcoderSprinkler (JOI22_sprinkler)C++20
0 / 100
4098 ms144156 KiB
#define NDEBUG #ifdef NDEBUG #define dbg(TXTMSG) if constexpr (false) cerr << "lol" #define dbgv(VARN) ((void)0) #define dbgfor(COND) if constexpr (false) for (COND) #else #define _GLIBCXX_DEBUG 1 #define _GLIBCXX_DEBUG_PEDANTIC 1 #pragma GCC optimize("trapv") #define dbg(TXTMSG) cerr << "\n" << TXTMSG #define dbgv(VARN) cerr << "\n" << #VARN << " = "<< VARN << ", line " << __LINE__ << "\n" #define dbgfor(COND) for (COND) #endif #include <bits/stdc++.h> using namespace std; using ll = long long; using pll = pair<ll,ll>; #define e0 first #define e1 second constexpr ll INFTY = 2e18; /*struct segtree { vector<ll> toadd; segtree(ll n) { toadd.assign(4*n,0); } ll get(ll x, ll lseg, ll rseg, ll node) { if (x<lseg||x>rseg) return 0; return toadd[node] } }*/ ll N,L; vector<vector<ll>> tree; vector<vector<ll>> children; vector<ll> parent; array<vector<ll>, 30> binright; array<vector<ll>, 30> binleft; vector<ll> dfsstack; void dfs(ll node) { dfsstack.push_back(node); for (ll child : tree[node]) { if (child==parent[node]) continue; children[node].push_back(child); parent[child]=node; dfs(child); } for (ll p = 0; (1ll<<p) < ll(dfsstack.size()); ++p) { ll ancnode = dfsstack[ll(dfsstack.size()) - 1 - (1ll<<p)]; if (binleft[p][ancnode]==-1) { binleft[p][ancnode]=node; } binright[p][ancnode]=node; } dfsstack.pop_back(); } pll getdescendent(ll node, ll d) { ll l = node; ll r = node; for (ll p = 0; (1ll<<p)<=d; ++p) { if (((d>>p)&1ll) == 1) { l = binleft[p][l]; r = binright[p][r]; } if (l==-1) { assert(r==-1); return {-1,-1}; } } return {l,r}; } int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); dbgv("Started"); cin >> N >> L; tree.assign(N,{}); for (ll i = 0; i < N-1; ++i) { ll a,b; cin >> a >> b; a--; b--; //c tree[a].push_back(b); tree[b].push_back(a); } children.assign(N,{}); parent.assign(N,-1); binleft.fill(vector<ll>(N,-1)); binright.fill(vector<ll>(N,-1)); dfs(0); ll currposn = 0; vector<ll> posn(N,-1); queue<ll> bfsq; bfsq.push(0); while (!bfsq.empty()) { ll curr=bfsq.front(); bfsq.pop(); posn[curr] = currposn++; for (ll child:children[curr]) { bfsq.push(child); } } vector<ll> H(N,-1); for (ll i = 0; i < N; ++i) { cin >> H[posn[i]]; } ll Q; cin >> Q; for (ll qno = 0; qno < Q; ++qno) { dbgv(qno); dbgfor (ll i = 0; i < N; ++i) { cerr << (H[posn[i]]) << " "; } ll t; cin >> t; if (t==1) { ll Xi,Di,Wi; cin >> Xi >> Di >> Wi; Xi--;//c ll currn = Xi; for (ll h = 0; h < Di; ++h) { dbgv(currn+1); if (currn==0) { for (ll d = 1; d <= Di-h; ++d) { pll r1 = getdescendent(currn,d); if (r1!=pll{-1,-1}) for (ll i = posn[r1.e0]; i <= posn[r1.e1]; ++i) { H[i] *= Wi; H[i] %= L; } } break; } pll r = getdescendent(currn,Di-h); if (r!=pll{-1,-1}) for (ll i = posn[r.e0]; i <= posn[r.e1]; ++i) { H[i] *= Wi; H[i] %= L; } r = getdescendent(currn,Di-h-1); if (r!=pll{-1,-1}) for (ll i = posn[r.e0]; i <= posn[r.e1]; ++i) { H[i] *= Wi; H[i] %= L; } currn=parent[currn]; assert(currn>=0); } dbgv(currn+1); H[posn[currn]] *= Wi; H[posn[currn]] %= L; } else if (t==2) { ll Xi; cin >> Xi; Xi--;//c cout << H[posn[Xi]] << "\n"; } else throw exception(); } }
#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...