제출 #1144106

#제출 시각아이디문제언어결과실행 시간메모리
11441060pt1mus23Osumnjičeni (COCI21_osumnjiceni)C++20
110 / 110
877 ms59952 KiB
#pragma GCC optimize("O1") // #pragma GCC optimize("O3,unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include <bits/stdc++.h> using namespace std; // #define int long long int #define ins insert #define pb push_back #define pii pair<int,int> #define endl '\n' #define all(x) x.begin(),x.end() const int mod = 998244353; const int inf = INT_MAX; const int LG = 18; const int sze = 2e5+23; struct segtreeMAX{ vector<pii> T; segtreeMAX(int n){ T.resize(4*n,{-inf,-inf}); } void upd(int node,int idx,int l,int r,pii v){ if(l==r){ T[node]=v; return; } int mid = (l+r)/2; if(idx<=mid) upd(2*node,idx,l,mid,v); else upd(2*node +1,idx,mid+1,r,v); T[node]=max(T[node*2],T[node *2+1]); } pii qry(int node,int l,int r,int lx,int rx){ if(lx>r || rx<l) return {-inf,-inf }; if(lx>=l && rx<=r) return T[node]; return max( qry(2*node,l,r,lx,(lx+rx)/2), qry(2*node +1,l,r,(lx+rx)/2 +1, rx) ); } }; struct segtreeMIN{ vector<pii> T; segtreeMIN(int n){ T.resize(4*n,{inf,inf}); } void upd(int node,int idx,int l,int r,pii v){ if(l==r){ T[node]=v; return; } int mid = (l+r)/2; if(idx<=mid) upd(2*node,idx,l,mid,v); else upd(2*node +1,idx,mid+1,r,v); T[node]=min(T[node*2],T[node *2+1]); } pii qry(int node,int l,int r,int lx,int rx){ if(lx>r || rx<l) return {inf,inf}; if(lx>=l && rx<=r) return T[node]; return min( qry(2*node,l,r,lx,(lx+rx)/2), qry(2*node +1,l,r,(lx+rx)/2 +1, rx) ); } }; int dp[LG][sze]; void fast(){ int n; cin>>n; vector<pii> arr(n); map<int,int> cp; for(int i=0;i<n;i++){ cin>>arr[i].first>>arr[i].second; cp[arr[i].first]++; cp[arr[i].second]++; } int c=0; for(auto &v:cp){ v.second = (c++); } for(int i=0;i<n;i++){ arr[i].first = cp[arr[i].first]; arr[i].second = cp[arr[i].second]; // cout<<arr[i].first<<" "<<arr[i].second<<endl; } int M = n*2; segtreeMAX st1(M+23); // [0, L] {R,i} segtreeMIN st2(M+23); // [R, N] {L,i} int r = n; for(int i=n-1;i>=0;i--){ while(true){ pii it = st1.qry(1,0,arr[i].second,0,M); if(it.first >=arr[i].first ){ r = min(r,it.second); st1.upd(1,arr[it.second].first,0,M,{-inf,-inf}); } else{ break; } } while(true){ pii it = st2.qry(1,arr[i].first,M,0,M); if(it.first <= arr[i].second){ r=min(r, it.second ); st2.upd(1,arr[it.second].second,0,M,{inf,inf}); } else{ break; } } dp[0][i]=r; st1.upd(1,arr[i].first,0,M,{arr[i].second,i}); st2.upd(1,arr[i].second,0,M,{arr[i].first,i}); } // cout<<dp[0][1]<<endl; dp[0][n]=n; for(int i= 1;i<LG;i++){ for(int j=0;j<=n;j++){ if(j==n){ dp[i][j]=n; } else{ dp[i][j]=dp[i-1][ dp[i-1][j] ]; } } } // cout<<dp[17][0]<<endl; int q; cin>>q; while(q--){ int l,r; cin>>l>>r; --l; --r; int ans=0; for(int i = LG-1;i>=0;i--){ if( dp[i][l] <= r ){ // cout<<i<<endl; ans|=(1<<i); l = dp[i][l]; } } cout<<ans+1<<endl; } } signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int tt =1; // cin>>tt; while(tt--){ fast(); } return 0; }
#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...