제출 #1358764

#제출 시각아이디문제언어결과실행 시간메모리
1358764ivazivaHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
47 / 100
1361 ms174280 KiB
#include <bits/stdc++.h>

using namespace std;

#define MAXN 1000005
#define MAXM 21
#define int long long

int n,m,w[MAXN],lg[MAXN];
int sparse[MAXM][MAXN];
int diff[MAXN];
vector<int> pos[MAXN];

int query(int l,int r) {int k=lg[r-l+1];return max(sparse[k][l],sparse[k][r-(1<<k)+1]);}

int32_t main()
{
    for (int i=2;i<MAXN;i++) lg[i]=lg[i/2]+1;
    cin>>n>>m;for (int i=1;i<=n;i++) cin>>w[i];
    if (n<=5000)
    {
        for (int i=1;i<=n;i++) sparse[0][i]=w[i];
        for (int j=1;j<MAXM;j++)
        {
            for (int i=1;i+(1<<j)-1<=n;i++) sparse[j][i]=max(sparse[j-1][i],sparse[j-1][i+(1<<(j-1))]);
        }
        for (int i=1;i<=m;i++)
        {
            int l,r,k;cin>>l>>r>>k;bool valid=true;
            for (int poz=r;poz>l;poz--)
            {
                int maxi=query(l,poz-1);
                if (maxi>w[poz] and maxi+w[poz]>k) {valid=false;break;}
            }
            if (valid) cout<<1<<endl;
            else cout<<0<<endl;
        }
        return 0;
    }
    bool subtask2=true;
    for (int i=1;i<=n;i++)
    {
        if (w[i]>1000) {subtask2=false;break;}
    }
    if (subtask2)
    {
        for (int i=1;i<=n;i++) pos[w[i]].push_back(i);
        for (int i=1;i<=n;i++) sparse[0][i]=w[i];
        for (int j=1;j<MAXM;j++)
        {
            for (int i=1;i+(1<<j)-1<=n;i++) sparse[j][i]=max(sparse[j-1][i],sparse[j-1][i+(1<<(j-1))]);
        }
        for (int i=1;i<=m;i++)
        {
            int l,r,k;cin>>l>>r>>k;bool valid=true;
            for (int weight=0;weight<=1000;weight++)
            {
                if (pos[weight].size()==0) continue;
                auto it=lower_bound(pos[weight].begin(),pos[weight].end(),r+1);
                if (it==pos[weight].begin()) continue;
                it--;if (*it<=l) continue;
                int maxi=query(l,(*it)-1);
                if (maxi>weight and maxi+weight>k) {valid=false;break;}
            }
            if (valid) cout<<1<<endl;
            else cout<<0<<endl;
        }
        return 0;
    }
    for (int i=1;i<n;i++) diff[i]=w[i]-w[i+1];
    for (int i=1;i<n;i++) sparse[0][i]=diff[i];
    for (int j=1;j<MAXM;j++)
    {
        for (int i=1;i+(1<<j)-1<n;i++) sparse[j][i]=max(sparse[j-1][i],sparse[j-1][i+(1<<(j-1))]);
    }
    for (int i=1;i<=m;i++)
    {
        int l,r,k;cin>>l>>r>>k;if (l==r) {cout<<1<<endl;continue;}
        if (query(l,r-1)>0) cout<<0<<endl;
        else cout<<1<<endl;
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…