Submission #704409

#TimeUsernameProblemLanguageResultExecution timeMemory
704409PacybwoahOsumnjičeni (COCI21_osumnjiceni)C++14
110 / 110
930 ms74636 KiB
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#define ll long long
using namespace std;
struct node{
    ll val,tag;
};
vector<node> seg;
void push(ll l,ll r,int ind){
    if(l==r) return;
    ll mid=(l+r)>>1;
    seg[ind*2].val+=(mid-l+1)*seg[ind].tag;
    seg[ind*2+1].val+=(r-mid)*seg[ind].tag;
    seg[ind*2].tag+=seg[ind].tag;
    seg[ind*2+1].tag+=seg[ind].tag;
    seg[ind].tag=0;
}
ll query(ll l,ll r,int start,int end,int ind){
    if(r<start||end<l) return 0;
    if(start<=l&&r<=end){
        return seg[ind].val;
    }
    ll mid=(l+r)>>1;
    push(l,r,ind);
    return query(l,mid,start,end,ind*2)+query(mid+1,r,start,end,ind*2+1);
}
void modify(ll l,ll r,int start,int end,ll num,int ind){
    if(r<start||end<l) return;
    if(start<=l&&r<=end){
        seg[ind].val+=(r-l+1)*num;
        seg[ind].tag+=num;
        return;
    }
    ll mid=(l+r)>>1;
    push(l,r,ind);
    modify(l,mid,start,end,num,ind*2);
    modify(mid+1,r,start,end,num,ind*2+1);
    seg[ind].val=(seg[ind*2].val+seg[ind*2+1].val);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,q;
    cin>>n;
    vector<pair<ll,ll>> vec(n+1);
    for(int i=1;i<=n;i++) cin>>vec[i].first>>vec[i].second;
    vector<ll> cc;
    for(int i=1;i<=n;i++){
        cc.push_back(vec[i].first);
        cc.push_back(vec[i].second);
    }
    sort(cc.begin(),cc.end());
    cc.resize(unique(cc.begin(),cc.end())-cc.begin());
    for(int i=1;i<=n;i++){
        vec[i].first=lower_bound(cc.begin(),cc.end(),vec[i].first)-cc.begin()+1;
        vec[i].second=lower_bound(cc.begin(),cc.end(),vec[i].second)-cc.begin()+1;
    }
    vector<int> far(n+1);
    seg.resize(4*cc.size()+4);
    ll len=cc.size()+1;
    int ii=1;
    for(int i=1;i<=n;i++){
        while(ii<=n&&query(1,len,vec[ii].first,vec[ii].second,1)==0) modify(1,len,vec[ii].first,vec[ii].second,1,1),ii++;
        far[i]=ii;
        modify(1,len,vec[i].first,vec[i].second,-1,1);
    }
    vector<vector<ll>> far2(n+1,vector<ll>(19));
    for(int i=1;i<=n;i++){
        far2[i][0]=far[i];
    }
    for(int i=1;i<19;i++){
        for(int j=1;j<=n;j++){
            if(far2[j][i-1]==n+1) far2[j][i]=n+1;
            else far2[j][i]=far2[far2[j][i-1]][i-1];
        }
    }
    int a,b;
    cin>>q;
    for(int i=0;i<q;i++){
        cin>>a>>b;
        int ans=1;
        for(int j=18;j>=0;j--){
            if(far2[a][j]<=b){
                a=far2[a][j];
                ans+=(1<<j);
            }
        }
        cout<<ans<<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...