Submission #883831

#TimeUsernameProblemLanguageResultExecution timeMemory
883831vjudge1Passport (JOI23_passport)C++17
0 / 100
1765 ms52608 KiB
#include <bits/stdc++.h> using namespace std; const int inf = 1e9 + 7; const int M = 30; struct SEGTMAX{//point update , range min query vector < int > tree; int sz; SEGTMAX(int x){ sz = x+3; tree.assign(4*sz,-inf); } void _update(int ind , int l , int r , int qp , int qv){ if(l == r){ tree[ind] = qv; return; } int mid = (l+r)/2; if(mid >= qp)_update(ind*2,l,mid,qp,qv); else _update(ind*2+1,mid+1,r,qp,qv); tree[ind] = max(tree[ind*2] , tree[ind*2+1]); } void update(int p ,int v){ _update(1,1,sz,p,v); } int _query(int ind , int l , int r , int ql , int qr){ if(l >= ql and r <= qr)return tree[ind]; else if(l > qr or r < ql)return -inf; int mid = (l+r)/2; return max(_query(ind*2,l,mid,ql,qr) , _query(ind*2+1,mid+1,r,ql,qr)); } int query(int l , int r){ if(l > r)return -inf; return _query(1,1,sz,l,r); } }; struct SEGTMIN{//point update , range min query vector < int > tree; int sz; SEGTMIN(int x){ sz = x+3; tree.assign(4*sz,inf); } void _update(int ind , int l , int r , int qp , int qv){ if(l == r){ tree[ind] = qv; return; } int mid = (l+r)/2; if(mid >= qp)_update(ind*2,l,mid,qp,qv); else _update(ind*2+1,mid+1,r,qp,qv); tree[ind] = min(tree[ind*2] , tree[ind*2+1]); } void update(int p ,int v){ _update(1,1,sz,p,v); } int _query(int ind , int l , int r , int ql , int qr){ if(l >= ql and r <= qr)return tree[ind]; else if(l > qr or r < ql)return inf; int mid = (l+r)/2; return min(_query(ind*2,l,mid,ql,qr) , _query(ind*2+1,mid+1,r,ql,qr)); } int query(int l , int r){ if(l > r)return inf; return _query(1,1,sz,l,r); } }; void solve(){ int n; cin >> n; int liftmin[n+1][M] , liftmax[n+1][M]; for(int i = 1;i<=n;i++){ cin >> liftmin[i][0] >> liftmax[i][0]; } for(int j = 1;j<M;j++){ SEGTMIN segtmin(n); SEGTMAX segtmax(n); for(int i = 1;i<=n;i++){ segtmin.update(i,liftmin[i][j-1]); segtmax.update(i,liftmax[i][j-1]); } //cout << "liftmin " << j-1 << " : ";for(int i = 1;i<=n;i++)cout << liftmin[i][j-1] << " ";cout << endl; //cout << "liftmax " << j-1 << " : ";for(int i = 1;i<=n;i++)cout << liftmax[i][j-1] << " ";cout << endl; for(int i = 1;i<=n;i++){ liftmin[i][j] = segtmin.query(liftmin[i][j-1] , liftmax[i][j-1]); liftmax[i][j] = segtmax.query(liftmin[i][j-1] , liftmax[i][j-1]); } } int q; cin >> q; while(q--){ int x; cin >> x; if(liftmin[x][M-1] != 1 or liftmax[x][M-1] != n){ cout << -1 << '\n'; continue; } int ansmin = 0 , ansmax = 0; for(int i = M-1;i>=0;i--){ if(liftmin[x][i] != 1){ ansmin += (1ll << i); x = liftmin[x][i]; } } if(x != 1)ansmin++; for(int i = M-1;i>=0;i--){ if(liftmax[x][i] != n){ ansmax += (1ll << i); x = liftmax[x][i]; } } if(x != n)ansmax++; cout << max(ansmin , ansmax) << '\n'; } } signed main(){ ios_base::sync_with_stdio(0);cin.tie(0); int testcase = 1;//cin >> testcase; while(testcase--)solve(); }
#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...