Submission #1104108

#TimeUsernameProblemLanguageResultExecution timeMemory
1104108andrewpEvent Hopping (BOI22_events)C++14
30 / 100
147 ms31932 KiB
//Dedicated to my love, ivaziva
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std; 
using ll=int64_t;
using pii=pair<int,int>; 
using pll=pair<int,int>;
#define all(x) x.begin(),x.end()
#define raint(x) x.rbegin(),x.rend()
#define pb push_back
#define fi first
#define se second
#define mp make_pair 
#define dbg(x) cerr<<#x<<": "<<x<<'\n';
#define dbga(A,l_,r_){cerr<<#A<<": ";for(int i_=l_;i_<=r_;i_++)cerr<<A[i_]<<' ';cerr<<'\n';}
#define dbgv(a_){cerr<<#a_<<": ";for(auto x_:a_) cerr<<x_<<' ';cerr<<'\n';}
const int N=1e5+50;
int n,q,l[N],r[N],ord[N],id[N],prv[N],lg[N],jmp[N][20];
pii up[N][20];
bool cmp(int i,int j){
    if(r[i]==r[j]) return l[i]<l[j];
    return r[i]<r[j];
}
pii Get(int l,int r){
    int k=lg[r-l+1]; 
    return min(up[l][k],up[r-(1<<k)+1][k]);
}
int main(){ 
    scanf("%d%d",&n,&q); 
    vector<int> cmprs; 
    for(int i=0;i<n;i++){
        scanf("%d%d",&l[i],&r[i]);
        cmprs.pb(l[i]); cmprs.pb(r[i]);
    }
    sort(all(cmprs)); cmprs.erase(unique(all(cmprs)),cmprs.end());
    for(int i=0;i<n;i++){
        l[i]=lower_bound(all(cmprs),l[i])-cmprs.begin();
        r[i]=lower_bound(all(cmprs),r[i])-cmprs.begin();
    }  
    iota(ord,ord+n,0);
    sort(ord,ord+n,cmp); 
    for(int i=0;i<n;i++) id[ord[i]]=i;
    vector<int> swl(n),swr(n);
    for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1; 
    for(int i=0;i<n;i++) swl[i]=l[ord[i]],swr[i]=r[ord[i]];
    for(int i=0;i<n;i++) l[i]=swl[i],r[i]=swr[i]; 
    for(int i=0;i<n;i++) up[i][0]=mp(l[i],i);
    for(int j=1;j<20;j++) for(int i=0;i+(1<<j)<=n;i++){
        up[i][j]=min(up[i][j-1],up[i+(1<<(j-1))][j-1]);
    } 
    for(int i=0;i<n;i++){
        int bot=0,top=i;
        prv[i]=i;
        while(bot<=top){
            int mid=(bot+top)/2;
            if(r[mid]>=l[i]){
                prv[i]=mid;
                top=mid-1;
            }else bot=mid+1;
        }
    }  
    for(int i=0;i<n;i++) jmp[i][0]=prv[i];
    for(int j=1;j<20;j++) for(int i=0;i<n;i++){
        jmp[i][j]=jmp[Get(jmp[i][j-1],i).se][j-1];
    }
    while(q--){
        int s,e; scanf("%d%d",&s,&e);
        --s,--e; s=id[s],e=id[e];
        if(s>e){printf("impossible\n");continue;}
        if(s==e){printf("0\n");continue;}
        if(r[s]>=l[e]&&r[s]<=r[e]){printf("1\n");continue;} 
        int ans=0;
        for(int i=19;i>=0;i--){
            if(jmp[e][i]>s){
                ans+=(1<<i);
                e=Get(jmp[e][i],e).se;
            }
        }
        if(jmp[e][0]<=s) ans++;
        else{printf("impossible\n");continue;}
        printf("%d\n",ans);
    }
    return 0;       
}

Compilation message (stderr)

events.cpp: In function 'int main()':
events.cpp:29:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   29 |     scanf("%d%d",&n,&q);
      |     ~~~~~^~~~~~~~~~~~~~
events.cpp:32:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |         scanf("%d%d",&l[i],&r[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~
events.cpp:67:23: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |         int s,e; scanf("%d%d",&s,&e);
      |                  ~~~~~^~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...