#include<bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define ln "\n"
using namespace std;
const ll INF = 2e18;
void solve(){
ll n, t; cin >> n >> t;
vector<vector<array<ll, 2>>> flight(n-1);
for (ll i=0; i<n-1; i++){
ll m; cin >> m;
flight[i].resize(m);
for (ll j=0; j<m; j++){
cin >> flight[i][j][0] >> flight[i][j][1];
}
sort(flight[i].begin(), flight[i].end());
}
// vector<vector<array<ll, 3>>> binjf(n-1, vector<array<ll, 3>>(17, {-1, -1, INF}));
vector<vector<array<ll, 2>>> pref(n-1), suff(n-1);
vector<vector<vector<array<ll, 3>>>> binj(n-1);
for (ll i=n-2; i>=0; i--){
ll m = flight[i].size();
pref[i].resize(m); suff[i].resize(m);
binj[i].resize(m, vector<array<ll, 3>>(17));
for (ll j=m-1; j>=0; j--){
suff[i][j]=min((j+1<m?suff[i][j+1]:array<ll, 2>{INF, -1}), {flight[i][j][1], j});
}
for (ll j=0; j<m; j++){
pref[i][j]=min((j?pref[i][j-1]:array<ll, 2>{INF, -1}), {flight[i][j][1], j});
}
if (i==n-2){
for (ll j=0; j<m; j++){
for (ll pw=0; pw<17; pw++) {
binj[i][j][pw]={i, j, 0};
// if (binjf[i][pw][2]>binj[i][j][pw]) binjf[i][pw]=binj[i][j][pw];
}
}
}else{
for (ll j=0; j<m; j++){
ll ind = lower_bound(flight[i+1].begin(), flight[i+1].end(), array<ll, 2>{flight[i][j][1], 0})-flight[i+1].begin();
if (ind==(ll)flight[i+1].size()){
ll dep = pref[i+1].back()[1];
binj[i][j][0] = {i+1, dep, flight[i][j][1]-flight[i][j][0]+t-flight[i][j][1]+flight[i+1][dep][0]};
}else{
ll dep = suff[i+1][ind][1];
binj[i][j][0] = {i+1, dep, flight[i][j][1]-flight[i][j][0]+flight[i+1][dep][0]-flight[i][j][1]};
}
for (ll pw=1; pw<17; pw++){
ll parj = binj[i][j][pw-1][1], pari=binj[i][j][pw-1][0], cost=binj[i][j][pw-1][2];
ll pparj = binj[pari][parj][pw-1][1], ppari=binj[pari][parj][pw-1][0], ppcost=binj[pari][parj][pw-1][2];
binj[i][j][pw]={ppari, pparj, cost+ppcost};
}
}
}
}
ll q; cin >> q;
vector<vector<array<ll, 2>>> qry(n);
for (ll i=0; i<q; i++){
ll l, r; cin >> l >> r; l--; r--; qry[l].push_back({r, i});
}
vector<ll> res(q);
ll cmp=0;
for (ll i=0; i<n; i++){
if (qry[i].empty()) continue;
sort(qry[i].begin(), qry[i].end());
vector<array<ll, 3>> pos; ll m = flight[i].size();
for (ll j=0; j<m; j++) pos.push_back({i, j, 0});
ll lpos=i;
// cout << i << ": ";
for (ll j=0; j<(ll)qry[i].size(); j++){
if (j and qry[i][j][0]==qry[i][j-1][0]){
res[qry[i][j][1]]=res[qry[i][j-1][1]]; continue;
}
ll cur = qry[i][j][0];
ll jmp = cur-lpos-1, best=INF;
for (auto &[ci, cj, cc]:pos){
for (ll pw=16; pw>=0; pw--){
if (jmp&(1<<pw)){
cc+=binj[ci][cj][pw][2];
ll nci = binj[ci][cj][pw][0];
ll ncj = binj[ci][cj][pw][1];
ci=nci; cj=ncj; cmp++;
}
}
best=min(best, cc+flight[ci][cj][1]-flight[ci][cj][0]);
}
// cout << cur << "&" << jmp << "=" << best << " ";
res[qry[i][j][1]]=best; lpos=cur-1;
sort(pos.begin(), pos.end());
pos.erase(unique(pos.begin(), pos.end(), [&](auto &op1, auto &op2){
if (op1[0]==op2[0] and op1[1]==op2[1]) return 1;
return 0;
}), pos.end());
}
// cout << ln;
}
for (ll i=0; i<q; i++) cout << res[i] << ln;
// assert(cmp<1e9);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll t=1;
// cin >> t;
while (t--){
solve();
}
}
# | 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... |