//#pragma GCC optimize("O3")
#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);
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void setIO(string s) {
freopen((s + ".in").c_str(), "r", stdin);
freopen((s + ".out").c_str(), "w", stdout);
}
const int mxn=1e5+5;
struct node{
vector<int> id;
vector<ll> sum;
int l,r;
void init(int n){
id=vector<int>(n,0);
sum=vector<ll>(n,0);
}
node(){}
};
vector<node> st(mxn*4);
vector<vector<pair<int,int>>> a(mxn);
vector<int> m(mxn);
int n,t;
const ll inf=(ll)1e18;
node comb(node L,node R){
if(L.id.empty()) return R;
else if(R.id.empty()) return L;
node ans;
int sz=(int)L.id.size();
int sz2=(int)R.id.size();
ans.init(sz);
ans.l=L.l;
ans.r=R.r;
//cout<<L.l<<' '<<L.r<<' '<<R.l<<' '<<R.r<<'\n';
for(int i=0;i<sz;i++){
int pos=a[L.r][L.id[i]].s;
ans.sum[i]=inf;
ans.id[i]=-1;
for(int j=0;j<sz2;j++){
ll tmp=L.sum[i]+R.sum[j];
tmp+=a[R.l][j].f-pos;
if(a[R.l][j].f<pos) tmp+=t;
if(tmp<ans.sum[i]){
ans.sum[i]=tmp;
ans.id[i]=R.id[j];
}
}
//cout<<ans.id[i]<<' '<<ans.sum[i]<<'\n';
}
return ans;
}
void build(int l=1,int r=n,int v=1){
if(l==r){
st[v].init(m[l]);
for(int i=0;i<m[l];i++){
st[v].id[i]=i;
st[v].sum[i]=a[l][i].s-a[l][i].f;
}
st[v].l=l;
st[v].r=l;
return;
}
int mid=(l+r)/2;
build(l,mid,v*2);
build(mid+1,r,v*2+1);
st[v]=comb(st[v*2],st[v*2+1]);
}
node query(int tl,int tr,int l=1,int r=n,int v=1){
if(r<tl or tr<l){
return node();
}
if(tl<=l and r<=tr){
return st[v];
}
int mid=(l+r)/2;
return comb(query(tl,min(mid,tr),l,mid,v*2),query(max(mid+1,tl),tr,mid+1,r,v*2+1));
}
int main() {_
cin>>n>>t;
for(int i=1;i<n;i++){
cin>>m[i];
for(int j=0;j<m[i];j++){
int l,r;
cin>>l>>r;
a[i].push_back({l,r});
}
}
build();
int q;
cin>>q;
for(int i=0;i<q;i++){
int l,r;
cin>>l>>r;
node ans=query(l,r-1);
ll mn=inf;
for(int j=0;j<(int)ans.id.size();j++){
mn=min(mn,ans.sum[j]);
}
cout<<mn<<'\n';
}
return 0;
}
//maybe its multiset not set
//yeeorz
//diaoborz
Compilation message (stderr)
Main.cpp: In function 'void setIO(std::string)':
Main.cpp:15:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
15 | freopen((s + ".in").c_str(), "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:16:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
16 | freopen((s + ".out").c_str(), "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |