#define ONLINE_JUDGE
#include <iostream>
#include <vector>
using namespace std;
typedef int64_t ll;
const ll mxn = 100005, mxlogn = 18;
vector <ll> falling, children[mxn];
ll n, q, i, j, k, diameter[mxn], parent[mxn][mxlogn], cost[mxn][mxlogn], cost0[mxn];
ll jumpCost(ll index, ll len) {
ll r = 0, start = index;
for (ll k = 0; k < mxlogn; k++) {
if (index < 0) return cost0[start];
if (len & 1 << k) {
r += cost[index][k];
index = parent[index][k];
}
}
return r;
}
ll jump(ll index, ll len) {
for (ll k = 0; k < mxlogn; k++) {
if (index < 0) return -1;
if (len & 1 << k) index = parent[index][k];
}
return index;
}
void calcCost0(ll node, ll co) {
cost0[node] = co;
for (ll &x : children[node]) calcCost0(x, co + cost[x][0]);
}
int main() {
cin >> n >> q;
for (i = 0; i < n; i++) {
cin >> diameter[i] >> cost[i][0];
for (j = 0; j < mxlogn; j++) parent[i][j] = -1;
}
#ifndef ONLINE_JUDGE
cout << "> Creating tree\n";
#endif
for (i = 0; i < n; i++) {
#ifndef ONLINE_JUDGE
cout << "| i = " << i << ", falling = [";
if (falling.empty()) cout << ']';
else {
for (ll &x : falling) cout << x << ", ";
cout << "\b\b]";
}
#endif
for (j = falling.size() - 1LL; j >= 0; j--) {
if (diameter[falling[j]] < diameter[i]) {
parent[falling[j]][0] = i;
children[i].push_back(falling[j]);
falling.erase(falling.begin() + j);
}
}
#ifndef ONLINE_JUDGE
cout << ", finished\n";
#endif
falling.push_back(i);
}
for (ll &x : falling) calcCost0(x, cost[x][0]);
#ifndef ONLINE_JUDGE
cout << "cost0 =";
for (i = 0; i < n; i++) cout << ' ' << cost0[i];
cout << "\n> Creating sparse tables\n";
#endif
for (j = 1; j < mxlogn; j++) {
#ifndef ONLINE_JUDGE
printf("| %7lldth parent", 1LL << j);
#endif
for (i = 0; i < n; i++) {
if (parent[i][j - 1] >= 0 && parent[parent[i][j - 1]][j - 1] >= 0) {
parent[i][j] = parent[parent[i][j - 1]][j - 1];
cost[i][j] = cost[i][j - 1] + cost[parent[i][j - 1]][j - 1];
}
else {
cost[i][j] = cost0[i];
}
#ifndef ONLINE_JUDGE
printf(" %4lld", parent[i][j]);
#endif
}
#ifndef ONLINE_JUDGE
printf("\n| %7lldth cost ", 1LL << j);
for (i = 0; i < n; i++) {
printf(" %4lld", cost[i][j]);
}
cout << '\n';
#endif
}
#ifndef ONLINE_JUDGE
cout << "Starting queries\n";
#endif
while (q--) {
cin >> i >> j; i--;
for (k = mxlogn - 1; k >= 0; k--) {
if (i < 0) break;
if (j > cost[i][k]) {
j -= cost[i][k];
i = parent[i][k];
}
}
cout << ++i << '\n';
}
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2644 KB |
Output is correct |
2 |
Correct |
3 ms |
2848 KB |
Output is correct |
3 |
Correct |
3 ms |
2792 KB |
Output is correct |
4 |
Correct |
4 ms |
2924 KB |
Output is correct |
5 |
Correct |
5 ms |
3060 KB |
Output is correct |
6 |
Correct |
5 ms |
3028 KB |
Output is correct |
7 |
Correct |
5 ms |
2900 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
399 ms |
38288 KB |
Output is correct |
2 |
Correct |
437 ms |
35520 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2644 KB |
Output is correct |
2 |
Correct |
3 ms |
2848 KB |
Output is correct |
3 |
Correct |
3 ms |
2792 KB |
Output is correct |
4 |
Correct |
4 ms |
2924 KB |
Output is correct |
5 |
Correct |
5 ms |
3060 KB |
Output is correct |
6 |
Correct |
5 ms |
3028 KB |
Output is correct |
7 |
Correct |
5 ms |
2900 KB |
Output is correct |
8 |
Correct |
399 ms |
38288 KB |
Output is correct |
9 |
Correct |
437 ms |
35520 KB |
Output is correct |
10 |
Correct |
5 ms |
2920 KB |
Output is correct |
11 |
Correct |
543 ms |
22132 KB |
Output is correct |
12 |
Correct |
597 ms |
40216 KB |
Output is correct |
13 |
Correct |
1477 ms |
38056 KB |
Output is correct |
14 |
Correct |
422 ms |
38536 KB |
Output is correct |
15 |
Execution timed out |
1570 ms |
33756 KB |
Time limit exceeded |
16 |
Halted |
0 ms |
0 KB |
- |