//#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;
const int inf2=1e9;
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 r=a[L.r][L.id[i]].s;
int pos=lower_bound(all(a[R.l]),make_pair(r,0))-a[R.l].begin();
if(pos==(int)a[R.l].size()) pos=0;
ll tmp=L.sum[i]+R.sum[pos];
tmp+=a[R.l][pos].f-r;
if(a[R.l][pos].f<r) tmp+=t;
ans.sum[i]=tmp;
ans.id[i]=R.id[pos];
}
return ans;
}
void build(int l=1,int r=n,int v=1){
if(l==r){
st[v].init((int)a[l].size());
for(int i=0;i<(int)a[l].size();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));
}
bool comp(pair<int,int> x,pair<int,int> y){
if(x.f!=y.f) return x.f<y.f;
return x.s>y.s;
}
bool comp2(pair<int,int> x,pair<int,int> y){
if(x.f!=y.f) return x.f>y.f;
return x.s<y.s;
}
int main() {_
cin>>n>>t;
vector<int> mnn(n,inf2);
vector<vector<pair<int,int>>> b(n);
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});
mnn[i]=min(mnn[i],r-l);
}
b[i]=a[i];
{
sort(all(a[i]),comp);
vector<pair<int,int>> tmp;
for(auto v:a[i]){
while(!tmp.empty() and tmp.back().s>=v.s){
tmp.pop_back();
}
tmp.push_back(v);
}
swap(tmp,a[i]);
}
}
for(int i=1;i<n;i++){
for(auto &v:b[i]){
swap(v.f,v.s);
}
{
sort(all(b[i]),comp2);
vector<pair<int,int>> tmp;
for(auto v:b[i]){
while(!tmp.empty() and tmp.back().s<=v.s){
tmp.pop_back();
}
tmp.push_back(v);
}
swap(tmp,b[i]);
reverse(all(b[i]));
}
}
for(int i=1;i<n-1;i++){
{
vector<bool> used((int)a[i+1].size());
used[0]=true;
for(auto v:a[i]){
int pos=lower_bound(all(a[i+1]),make_pair(v.s,0))-a[i+1].begin();
if(pos==(int)a[i+1].size()) pos=0;
used[pos]=true;
}
vector<pair<int,int>> tmp;
for(int j=0;j<(int)a[i+1].size();j++){
if(used[j]) tmp.push_back(a[i+1][j]);
}
swap(tmp,a[i+1]);
}
}
build();
int q;
cin>>q;
for(int i=0;i<q;i++){
int l,r;
cin>>l>>r;
if(l+1==r){
cout<<mnn[l]<<'\n';
continue;
}
node ans=query(l+1,r-1);
ll mn=inf;
for(int j=0;j<(int)a[l+1].size();j++){
int pos=upper_bound(all(b[l]),make_pair(a[l+1][j].f,inf2))-b[l].begin()-1;
ll tmp=ans.sum[j];
if(pos==-1){
pos=(int)b[l].size()-1;
tmp+=t;
}
tmp+=(a[l+1][j].f-b[l][pos].s);
mn=min(mn,tmp);
}
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... |