Submission #1279213

#TimeUsernameProblemLanguageResultExecution timeMemory
1279213herominhsteveHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
100 / 100
802 ms80880 KiB
#include <bits/stdc++.h> #define el '\n' #define FNAME "Library" #define allof(x) x.begin(),x.end() #define allof1(x) x.begin()+1,x.end() #define mset(x,n) memset(x,(n),sizeof(x)) using namespace std; const long long MOD = (long long)1e9 + 7; template<class X,class Y> bool minimize(X &a,Y b){ if(a>b){a=b;return true;}return false;} template<class X,class Y> bool maximize(X &a,Y b){ if(a<b){a=b;return true;}return false;} void setup(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); if(fopen(FNAME".inp","r")){ freopen(FNAME".inp","r",stdin); freopen(FNAME".out","w",stdout); } } using ll = long long; const ll NEG = -(1LL<<60); struct Query{ int l,r; ll k; int id; }; int n,q; vector<ll> a; vector<int> prevGreater; vector<ll> pairVal; struct SegmentTree{ int n; vector<ll> st; SegmentTree(): n(0) {} SegmentTree(int N){init(N);} void init(int N){ n = N; st.assign(4*N+5, NEG); } void update(int node,int l,int r,int pos,ll val){ if(l==r){ st[node] = max(st[node],val); return; } int mid=(l+r)>>1; if(pos<=mid) update(node<<1,l,mid,pos,val); else update(node<<1|1,mid+1,r,pos,val); st[node] = max(st[node<<1],st[node<<1|1]); } void point_update_max(int pos,ll val){ update(1,1,n,pos,val); } ll query(int node,int l,int r,int L,int R){ if(R<l || r<L) return NEG; if(L<=l && r<=R) return st[node]; int mid=(l+r)>>1; return max(query(node<<1,l,mid,L,R), query(node<<1|1,mid+1,r,L,R)); } ll range_max(int L,int R){ if(L>R) return NEG; return query(1,1,n,L,R); } } seg; void init(){ cin >> n >> q; a.assign(n+1,0); for(int i=1;i<=n;i++) cin >> a[i]; prevGreater.assign(n+1,0); pairVal.assign(n+1,NEG); vector<int> st; st.reserve(n); for(int i=1;i<=n;i++){ while(!st.empty() && a[st.back()] <= a[i]) st.pop_back(); if(!st.empty()) prevGreater[i] = st.back(); else prevGreater[i] = 0; st.push_back(i); if(prevGreater[i] > 0) pairVal[i] = a[i] + a[prevGreater[i]]; } } void sol(){ vector<Query> qs; qs.reserve(q); for(int i=0;i<q;i++){ int l,r; ll k; cin >> l >> r >> k; qs.push_back({l,r,k,i}); } sort(qs.begin(), qs.end(), [](const Query&A,const Query&B){ if(A.r != B.r) return A.r < B.r; return A.l < B.l; }); seg.init(n); vector<int> ans(q,0); int ptr=0; for(int r=1;r<=n;r++){ if(prevGreater[r]>0){ seg.point_update_max(prevGreater[r], pairVal[r]); } while(ptr<(int)qs.size() && qs[ptr].r==r){ int L=qs[ptr].l; int R=qs[ptr].r; ll k=qs[ptr].k; int id=qs[ptr].id; ll mx=seg.range_max(L,R); if(mx==NEG) ans[id]=1; else ans[id]=(mx<=k)?1:0; ++ptr; } } for(int i=0;i<q;i++) cout << ans[i] << el; } int main(){ setup(); init(); sol(); return 0; }

Compilation message (stderr)

sortbooks.cpp: In function 'void setup()':
sortbooks.cpp:16:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |         freopen(FNAME".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
sortbooks.cpp:17:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |         freopen(FNAME".out","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...