#pragma GCC optimize("Ofast")
#include "dungeons.h"
//#include "grader.cpp"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define f first
#define s second
#define all(x) x.begin(),x.end()
#define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
namespace{
    const int mxn=4e5+5;
    const ll inf=(ll)1e18;
    const int k=8;
    int N;
    int S[mxn];
    int P[mxn];
    int W[mxn];
    int L[mxn];
    int id[mxn];
    struct node{
        ll sum;
        ll mn;
        int nxt;
    };
    node merge(node a,node b){
        node c;
        c.sum=a.sum+b.sum;
        c.nxt=b.nxt;
        c.mn=min(a.mn,b.mn-a.sum);
        return c;
    }
    struct graph{
        int bound;
        vector<vector<node>> st;
        void build(int _bound){
            st=vector<vector<node>>(mxn,vector<node>(28));
            bound=_bound;
            for(int i=0;i<=N;i++){
                st[i][0].nxt=(S[i]>bound?L[i]:W[i]);
                st[i][0].sum=(S[i]>bound?P[i]:S[i]);
                if(S[i]>bound or i==N){
                    st[i][0].mn=S[i];
                }
                else{
                    st[i][0].mn=inf;
                }
            }
            for(int j=1;j<28;j++){
                for(int i=0;i<=N;i++){
                    st[i][j]=merge(st[i][j-1],st[st[i][j-1].nxt][j-1]);
                }
            }
        }
        pair<int,ll> solve(int x,ll z){
            if(z>=S[x]){
                return {x,z};
            }
            node c;
            c.sum=(S[x]>bound?P[x]:S[x]);
            c.nxt=(S[x]>bound?L[x]:W[x]);
            c.mn=inf;
            for(int t=27;t>=0;t--){
                int cur=c.nxt;
                if(z+c.sum<st[cur][t].mn){
                    c=merge(c,st[cur][t]);
                }
            }
            int cur=c.nxt;
            z+=c.sum;
            return make_pair(cur,z);
        }
    };
    vector<graph> G(k);
}
void init(int _n, std::vector<int> _S, std::vector<int> _P, std::vector<int> _w, std::vector<int> _l) {
    N=_n;
    for(int i=0;i<N;i++){
        S[i]=_S[i];
        P[i]=_P[i];
        W[i]=_w[i];
        L[i]=_l[i];
    }
    W[N]=N;
    L[N]=N;
    for(int i=0;i<N;i++){
        id[i]=__lg(S[i]);
    }
    id[N]=k;
    for(int i=0;i<k;i++){
        G[i].build(1<<(i*3));
    }
	return;
}
long long simulate(int x, int Z) {
    ll z=Z;
    //cout<<'\n';
    while(x!=N){
        int t=min(24-1,(int)__lg(z));
        t=(t/3);
        //cout<<"st "<<x<<' '<<z<<'\n';
        tie(x,z)=G[t].solve(x,z);
        //cout<<"en "<<x<<' '<<z<<'\n';
        if(x==N) return z;
        if(z>=S[x]){
            z+=S[x];
            x=W[x];
        }
        else{
            z+=P[x];
            x=L[x];
        }
        if(x==N) return z;
    }
	return z;
}
| # | 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... |