Submission #480271

#TimeUsernameProblemLanguageResultExecution timeMemory
480271Ronin13Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
30 / 100
1121 ms98364 KiB
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define pll pair<ll,ll>
#define pii pair<int,int>
#define f first
#define s second
#define pb push_back
#define epb emplace back
#define inf 1e9+1
#define linf 1e18+1
using namespace std;

void solve(){
    int n,m;cin>>n>>m;
    int a[n+1];
    int mx=0;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)mx=max(mx,a[i]);
    if(mx<1000){
        int used[2001];
        int dp[2001];
        for(int i=0;i<=2000;i++)used[i]=-1;
        for(int i=0;i<=2000;i++)dp[i]=-1;
        vector<pair<pii,pii> >q;
        int ind=0;
        while(m--){
            int l,r,x;cin>>l>>r>>x;
            q.pb({{r,l},{x,ind++}});
        }
        ind=0;
        sort(q.begin(),q.end());
        vector<int>ans(100001);
        for(int i=1;i<=n;i++){
            for(int w=1999;w>=0;w--){
                int x=w-a[i];
                if(x>a[i]){
                    dp[w]=max({dp[w],dp[w+1],used[x]});
                }
                else dp[w]=max(dp[w+1],dp[w]);
            }
            used[a[i]]=i;
            while(ind<q.size()){
                if(q[ind].f.f!=i)break;
                int ww=q[ind].s.f;
                int l=q[ind].f.s;
                int idx=q[ind].s.s;
                if(ww>=2000){
                    ans[idx]=1;
                    ind++;
                    continue;
                }
                if(dp[ww+1]>=l)ans[idx]=0;
                else ans[idx]=1;
                ind++;
            }
        }
        for(int i=0;i<ind;i++)cout<<ans[i]<<"\n";
        return;
    }
    if(n<=5000){
        int mx[n+1][n+1];
        for(int i=1;i<=n;i++){
            mx[i][i]=a[i];
            for(int j=i+1;j<=n;j++)mx[i][j]=max(mx[i][j-1],a[j]);
        }
        while(m--){
            int l,r,x;cin>>l>>r>>x;
            bool ind=true;
            for(int i=l+1;i<=r;i++){
                if(a[i]<mx[l][i-1]){
                    if(a[i]+mx[l][i-1]>x){
                        ind=false;
                    }
                }
            }
            if(ind)cout<<1<<"\n";
            else cout<<0<<"\n";
        }
        return;
    }
    vector<pii>aa,b;
    aa.pb({0,0});
    b.pb({0,0});
    int st=1;
    for(int i=2;i<=n;i++){
        if(a[i]<a[i-1]){
            aa.pb({st,st});
            b.pb({i-1,st});
            st=i;
        }
    }
    aa.pb({st,st});
    b.pb({n,st});
    while(m--){
        int l,r,x;cin>>l>>r>>x;
        pii ss={l,inf},rr={r,-6};
        int ind=upper_bound(aa.begin(),aa.end(),ss)-aa.begin()-1;
        int ind1=lower_bound(b.begin(),b.end(),rr)-b.begin();
        if(aa[ind].s==b[ind1].s)cout<<1<<"\n";

        else cout<<0<<"\n";
    }
}

int main(){
    ios_base::sync_with_stdio(false);cin.tie(0);
    //freopen("in.in","r",stdin);freopen("out.out","w",stdout);
    int test=1;//cin>>test;
    while(test--){
        solve();
    }
}

Compilation message (stderr)

sortbooks.cpp: In function 'void solve()':
sortbooks.cpp:43:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |             while(ind<q.size()){
      |                   ~~~^~~~~~~~~
#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...