#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>, 25> binright;
array<vector<ll>, 25> 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);
}
/*if (ll(dfsstack.size())>3 && dfsstack[ll(dfsstack.size()) - 3]==536)
{
dbgv("huh");
dbgv(node);
}*/
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();
}
vector<ll> posn;
pll getdescendent(ll node, ll d)
{
ll l = node;
ll r = node;
for (ll p = 0; (1ll<<p)<=d; ++p)
{
//dbgv(l);dbgv(r);dbgv(p);
if (((d>>p)&1ll) == 1)
{
l = binleft[p][l];
r = binright[p][r];
}
if (l==-1 || r==-1)
{
/* dbgv(node);
dbgv(d);
dbgv(r);*/
return {-1,-1};
}
}
if (posn[l]<=posn[r]) return {l,r};
else return {-1,-1};
}
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;
posn.assign(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);
}
}
for (ll p = 0; p<25; p++)
{
for (ll i = 1; i < N; ++i)
{
if (binright[p][posn[i]]==-1)
{
binright[p][posn[i]] = binright[p][posn[i-1]];
}
}
for (ll i = N-2; i >=0; --i)
{
if (binleft[p][posn[i]]==-1)
{
binleft[p][posn[i]] = binleft[p][posn[i+1]];
}
}
}
/* dbgfor (auto i : children[712]) dbgv(i);
dbgfor (auto i : children[26]) dbgv(i);
dbgfor (auto i : children[278]) dbgv(i);
dbgv(getdescendent(706,26).e0);*/
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 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... |