#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MXN = 4e5 + 45;
int s[MXN], p[MXN], w[MXN], l[MXN], n;
ll add[MXN], st[24][MXN][3];
void init(int N, vector<int> S, vector<int> P, vector<int> W, vector<int> L) {
n = N;
for (int i = 0; i < n; i++)
s[i] = S[i], w[i] = W[i], p[i] = P[i], l[i] = L[i], add[i] = S[i];
for (int i = n - 1; i >= 0; i--) {
ll cur = s[i] + s[i];
while (w[i] < n && s[w[i]] <= cur) {
cur += add[w[i]];
add[i] += add[w[i]];
w[i] = w[w[i]];
}
}
for (int i = 0; i < n; i++) {
st[0][i][0] = l[i];
st[0][i][1] = s[i] + p[i] - s[l[i]];
st[0][i][2] = max(0ll, st[0][i][1]);
}
for (int b = 1; b < 24; b++) {
for (int i = 0; i < n; i++) {
int h = st[b - 1][i][0];
st[b][i][0] = st[b - 1][h][0];
st[b][i][1] = st[b - 1][i][1] + st[b - 1][h][1];
st[b][i][2] = max(st[b - 1][i][2], st[b - 1][i][1] + st[b - 1][h][2]);
}
}
}
ll simulate(int x, int z) {
ll cur = z;
while (x < n) {
if (s[x] > cur) {
ll now = cur - s[x];
int b = 23;
while (b >= 0) {
if (b) {
if (st[b - 1][x][2] + now < 0) {
now += st[b - 1][x][1];
x = st[b - 1][x][0];
b++;
}
} else {
now += st[b][x][1];
x = st[b][x][0];
}
b--;
}
cur = s[x] + now;
} else {
cur += add[x];
x = w[x];
}
}
return cur;
}
# | 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... |