Submission #1176285

#TimeUsernameProblemLanguageResultExecution timeMemory
11762858pete8Event Hopping (BOI22_events)C++20
20 / 100
241 ms106596 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int,int>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
#define sz(x) (int)((x).size())
#define int long long
using namespace std;
const int mod=1e9+7,mxn=4e5,inf=1e18,minf=-1e18,lg=30,Mxn=1e6;
//#undef int
int n,k,m,d,q,T;
void setIO(string name){
	ios_base::sync_with_stdio(0); cin.tie(0);
	freopen((name+".in").c_str(),"r",stdin);
	freopen((name+".out").c_str(),"w",stdout);
}
int go[mxn+10][lg+1],back[mxn+10][lg+1];
struct seg{
	int v[2*mxn+10];
	void init(){for(int i=0;i<=4*n;i++)v[i]=inf;}
	void update(int pos,int val){
		pos+=2*n;
		v[pos]=min(v[pos],val);
		for(int i=pos;i>0;i>>=1)v[i>>1]=min(v[i],v[i^1]);
	}
	int qry(int l,int r){
		int ans=inf;
		for(l+=2*n,r+=2*n;l<=r;l>>=1,r>>=1){
			if(l&1)ans=min(ans,v[l++]);
			if(!(r&1))ans=min(ans,v[r--]);
		}
		return ans;
	}
}t;
int B[mxn+10];
int32_t main(){
	fastio
	cin>>n>>q;
	vector<int>comp;
	vector<pii>event(n);
	for(auto &i:event){
		cin>>i.f>>i.s;
		comp.pb(i.f);
		comp.pb(i.s);
	}
	sort(all(comp));
	comp.erase(unique(all(comp)),comp.end());
	for(auto &i:event){
		i.f=lb(all(comp),i.f)-comp.begin();
		i.s=lb(all(comp),i.s)-comp.begin();
	}
	t.init();
	for(int i=0;i<comp.size();i++)back[i][0]=B[i]=inf;
	for(auto i:event){
		go[i.f][0]=max(go[i.f][0],i.s);
		t.update(i.s,i.f);
		B[i.s]=min(B[i.s],i.f);
	}
	for(int i=1;i<comp.size();i++)go[i][0]=max(go[i][0],go[i-1][0]);
	for(auto i:event)back[i.f][0]=min(back[i.f][0],t.qry(i.f,i.s));
	for(int j=1;j<=lg;j++)for(int i=0;i<comp.size();i++){
		go[i][j]=go[go[i][j-1]][j-1];
		back[i][j]=((back[i][j-1]==inf)?inf:back[back[i][j-1]][j-1]);
	}
	while(q--){
		int a,b;cin>>a>>b;
		a--,b--;
		if(a==b){
			cout<<0<<'\n';
			continue;
		}
		if(event[b].f<=event[a].s&&event[a].s<=event[b].s){
			cout<<1<<'\n';
			continue;
		}
		if(event[a].f>event[b].s)cout<<"impossible\n";
		else{
			int cur=event[a].s,ans=0,cur2=event[b].f;
			for(int i=lg;i>=0;i--){
				if(go[cur][i]>cur&&go[cur][i]<cur2)cur=go[cur][i],ans+=(1LL<<i);
			}
			for(int i=lg;i>=0;i--){
				if(back[cur2][i]<cur2&&back[cur2][i]>cur)cur2=back[cur2][i],ans+=(1LL<<i);
			}
			if(back[cur2][0]>=B[cur]&&back[cur2][0]<=cur)cout<<ans+2<<'\n';
			else cout<<"impossible\n";
		}
	}
}

Compilation message (stderr)

events.cpp:16:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
   16 | #pragma GCC optimize ("03,unroll-lopps")
      |                                        ^
events.cpp:23:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   23 | void setIO(string name){
      |                       ^
events.cpp:31:19: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   31 |         void init(){for(int i=0;i<=4*n;i++)v[i]=inf;}
      |                   ^
events.cpp:32:36: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   32 |         void update(int pos,int val){
      |                                    ^
events.cpp:37:28: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   37 |         int qry(int l,int r){
      |                            ^
events.cpp:47:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   47 | int32_t main(){
      |              ^
events.cpp: In function 'void setIO(std::string)':
events.cpp:25:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   25 |         freopen((name+".in").c_str(),"r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
events.cpp:26:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   26 |         freopen((name+".out").c_str(),"w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...