#include "dungeons.h"
#include <iostream>
#include <vector>
#include <cassert>
#include <cstdio>
long long hp[400005];
long long addw[400005];
long long addl[400005];
long long muchw[400005];
long long muchl[400005];
long long spar[400005];
int nmax;
using namespace std;
vector<int>adj[400005];
int bl[20][400005];
void dfs(int curr,int par)
{
spar[curr]=spar[par]+addw[curr];
bl[0][curr]=par;
for(int i=1;i<=19;i++)
{
bl[i][curr]=bl[i-1][bl[i-1][curr]];
}
for(auto k:adj[curr])
{
dfs(k,curr);
}
}
void init(int n, std::vector<int> s, std::vector<int> p, std::vector<int> w, std::vector<int> l) {
nmax=n;
for(int i=1;i<=n;i++)
{
hp[i]=s[i-1];
addw[i]=s[i-1];
addl[i]=p[i-1];
muchw[i]=w[i-1]+1;
muchl[i]=l[i-1]+1;
}
for(int i=n-1;i>=1;i--)
{
while(hp[i]+addw[i]>=hp[muchw[i]] && muchw[i]!=n+1)
{
addw[i]=addw[i]+addw[muchw[i]];
muchw[i]=muchw[muchw[i]];
}
//cout<<i<<" "<<addw[i]<<" "<<muchw[i]<<'\n';
}
/*
for(int i=1;i<=n;i++)
{
adj[w[i]].push_back(i);
}*/
//dfs(n+1,n+1);
return;
}
long long simulate(int x, int z) {
long long z2=z;
x++;
while(x!=(nmax+1))
{
if(z2>=hp[x])
{
z2=z2+addw[x];
x=muchw[x];
}
else
{
z2=z2+addl[x];
x=muchl[x];
}
}
return z2;
}