Submission #1230616

#TimeUsernameProblemLanguageResultExecution timeMemory
1230616TadijaSebezGift Exchange (JOI24_ho_t4)C++20
88 / 100
2599 ms168300 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back const int N=500050; int a[N],b[N],L[N],R[N],aid[N],bid[N]; namespace Seg1{ const int M=2*N; int root,tsz,ls[M],rs[M]; set<pair<int,int>> vals[M]; void Add(int&c,int ss,int se,int qi,int y,int i){ if(!c)c=++tsz; vals[c].insert({y,i}); auto it=vals[c].find({y,i}); vals[c].erase(vals[c].begin(),it); if(ss==se)return; int mid=ss+se>>1; if(qi<=mid)Add(ls[c],ss,mid,qi,y,i); else Add(rs[c],mid+1,se,qi,y,i); } int Get(int c,int ss,int se,int qs,int qe,int y){ if(qs>qe||qs>se||ss>qe||!c)return 0; if(qs<=ss&&qe>=se){ auto it=vals[c].lower_bound({y,0}); if(it==vals[c].end())return 0; else return it->second; } int mid=ss+se>>1; return max(Get(ls[c],ss,mid,qs,qe,y),Get(rs[c],mid+1,se,qs,qe,y)); } void Clear(){ for(int i=1;i<=tsz;i++){ ls[i]=rs[i]=0; vals[i].clear(); } root=tsz=0; } } vector<pair<int,int>> Qs[N]; vector<int> Us[N]; const int inf=1e9+7; namespace Seg2{ const int M=2*N; int root,tsz,ls[M],rs[M],mn[M]; void Build(int&c,int ss,int se){ c=++tsz; if(ss==se){ mn[c]=L[ss]; return; } int mid=ss+se>>1; Build(ls[c],ss,mid); Build(rs[c],mid+1,se); mn[c]=min(mn[ls[c]],mn[rs[c]]); } void Set(int c,int ss,int se,int qi,int f){ if(ss==se){ mn[c]=f; return; } int mid=ss+se>>1; if(qi<=mid)Set(ls[c],ss,mid,qi,f); else Set(rs[c],mid+1,se,qi,f); mn[c]=min(mn[ls[c]],mn[rs[c]]); } int Get(int c,int ss,int se,int qs,int qe){ if(qs>qe||qs>se||ss>qe)return inf; if(qs<=ss&&qe>=se)return mn[c]; int mid=ss+se>>1; return min(Get(ls[c],ss,mid,qs,qe),Get(rs[c],mid+1,se,qs,qe)); } } bool ans[N]; int main(){ int n; scanf("%i",&n); for(int i=1;i<=n;i++){ scanf("%i",&a[i]); } vector<int> arr; for(int i=1;i<=n;i++){ scanf("%i",&b[i]); arr.pb(b[i]); } sort(arr.begin(),arr.end()); for(int i=1;i<=n;i++){ bid[i]=lower_bound(arr.begin(),arr.end(),b[i])-arr.begin()+1; aid[i]=upper_bound(arr.begin(),arr.end(),a[i])-arr.begin(); } for(int i=1;i<=n;i++){ L[i]=Seg1::Get(Seg1::root,1,n,1,aid[i],b[i]); Seg1::Add(Seg1::root,1,n,bid[i],a[i],i); } Seg1::Clear(); for(int i=n;i>=1;i--){ R[i]=n+1-Seg1::Get(Seg1::root,1,n,1,aid[i],b[i]); Seg1::Add(Seg1::root,1,n,bid[i],a[i],n+1-i); Us[R[i]].pb(i); } Seg2::Build(Seg2::root,1,n); int q; scanf("%i",&q); for(int i=1;i<=q;i++){ int l,r; scanf("%i %i",&l,&r); Qs[r].pb({l,i}); } for(int i=1;i<=n;i++){ for(int j:Us[i]){ Seg2::Set(Seg2::root,1,n,j,inf); } for(auto qu:Qs[i]){ ans[qu.second]=Seg2::Get(Seg2::root,1,n,qu.first,i)>=qu.first; } } for(int i=1;i<=q;i++)printf(ans[i]?"Yes\n":"No\n"); return 0; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:85:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   85 |     scanf("%i",&n);
      |     ~~~~~^~~~~~~~~
Main.cpp:87:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |         scanf("%i",&a[i]);
      |         ~~~~~^~~~~~~~~~~~
Main.cpp:91:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   91 |         scanf("%i",&b[i]);
      |         ~~~~~^~~~~~~~~~~~
Main.cpp:111:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |     scanf("%i",&q);
      |     ~~~~~^~~~~~~~~
Main.cpp:114:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  114 |         scanf("%i %i",&l,&r);
      |         ~~~~~^~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...