Submission #751396

#TimeUsernameProblemLanguageResultExecution timeMemory
751396bgnbvnbvOsumnjičeni (COCI21_osumnjiceni)C++14
110 / 110
729 ms101548 KiB
#include<bits/stdc++.h> #define TASKNAME "codeforce" #define pb push_back #define pli pair<int,int> #define fi first #define se second #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); using namespace std; using ll=long long; const ll maxN=2e5+10; const ll inf=1e18; const ll mod=1e9+7; struct Tinter { ll l,r,id; bool operator<(const Tinter&o) { return l<o.l; } }e[maxN]; ll lazy[8*maxN],st[8*maxN]; void down(ll id) { ll &x=lazy[id]; if(x!=-1) { st[id*2]=x; lazy[id*2]=x; st[id*2+1]=x; lazy[id*2+1]=x; x=-1; } } ll n; void update(ll i,ll j,ll val,ll id=1,ll l=1,ll r=2*n) { if(j<l||r<i) return; if(i<=l&&r<=j) { st[id]=val; lazy[id]=val; return; } ll mid=l+r>>1; down(id); update(i,j,val,id*2,l,mid); update(i,j,val,id*2+1,mid+1,r); st[id]=min(st[id*2],st[id*2+1]); } ll get(ll i,ll j,ll id=1,ll l=1,ll r=2*n) { if(j<l||r<i) return n+1; if(i<=l&&r<=j) return st[id]; ll mid=l+r>>1; down(id); return min(get(i,j,id*2,l,mid),get(i,j,id*2+1,mid+1,r)); } ll r[maxN]; ll mn[maxN][19],nxt[maxN][19]; int log(ll x) { return 64 - __builtin_clzll(x) - 1; } ll g(ll i,ll j) { ll k=j-i+1; k=log(k); return min(mn[i][k],mn[j-(1<<k)+1][k]); } void solve() { vector<ll>vec; cin >> n; for(int i=1;i<=n;i++) { cin >> e[i].l >> e[i].r; vec.pb(e[i].l); vec.pb(e[i].r); e[i].id=i; r[i]=n+1; } sort(vec.begin(),vec.end()); for(int i=1;i<=n;i++) { e[i].l=lower_bound(vec.begin(),vec.end(),e[i].l)-vec.begin()+1; e[i].r=lower_bound(vec.begin(),vec.end(),e[i].r)-vec.begin()+1; } fill(st,st+8*maxN,n+1); fill(lazy,lazy+8*maxN,-1); for(int i=n;i>=1;i--) { r[i]=min(r[i],get(e[i].l,e[i].r)); update(e[i].l,e[i].r,i); mn[i][0]=r[i]; //cout << r[i]<<' '; } for(int j=1;j<=18;j++) { for(int i=1;i<=n;i++) { if(i+(1<<j)-1>n) break; mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]); } } for(int i=1;i<=n;i++) { ll low=i,high=n; while(low<=high) { ll mid=low+high>>1; if(g(i,mid)>mid) low=mid+1; else high=mid-1; } nxt[i][0]=low; } //cout << '\n'; nxt[n+1][0]=n+1; for(int j=1;j<=18;j++) { for(int i=1;i<=n+1;i++) { nxt[i][j]=nxt[nxt[i][j-1]][j-1]; } } ll q; cin >> q; while(q--) { ll a,b; cin >> a >> b; ll ans=1; for(int j=18;j>=0;j--) { if(nxt[a][j]<=b) { a=nxt[a][j]; ans+=1<<j; } } cout << ans<<'\n'; } } int main() { fastio //freopen(TASKNAME".INP","r",stdin); //freopen(TASKNAME".OUT","w",stdout); solve(); }

Compilation message (stderr)

Main.cpp: In function 'void update(ll, ll, ll, ll, ll, ll)':
Main.cpp:44:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   44 |     ll mid=l+r>>1;
      |            ~^~
Main.cpp: In function 'll get(ll, ll, ll, ll, ll)':
Main.cpp:54:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   54 |     ll mid=l+r>>1;
      |            ~^~
Main.cpp: In function 'void solve()':
Main.cpp:110:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  110 |             ll mid=low+high>>1;
      |                    ~~~^~~~~
#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...