Cod sursa(job #3164405)

Utilizator vladorovOroviceanu Vlad vladorov Data 3 noiembrie 2023 02:28:31
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <unordered_map>

using namespace std;

bool is_unique(const unordered_map<int, int>& frecv){
    for(auto i : frecv){
        if(i.second>1) return false;
    }

    return true;
}

int main(){
    int lim; cin>>lim;

    int rmq_min[(int)log2(lim)+1][lim], rmq_max[(int)log2(lim)+1][lim];

    for(int i=0; i<lim; i++){
        cin>>rmq_min[0][i]; rmq_max[0][i]=rmq_min[0][i];
    }

    for(int p=2; (1<<(p-1))<=lim; p++){
        for(int i=0; i<lim; i++){
            rmq_min[p-1][i]=rmq_min[p-2][i];
            rmq_max[p-1][i]=rmq_max[p-2][i];

            int j=i+(1<<(p-2));
            if(j<lim) rmq_min[p-1][i]=min(rmq_min[p-2][i], rmq_min[p-2][j]);
            if(j<lim) rmq_max[p-1][i]=max(rmq_max[p-2][i], rmq_max[p-2][j]);
        }
    }

    int nrq; cin>>nrq;

    unordered_map<int, int> frecv_secv;

    for(int i=0; i<nrq; i++){
        int p1, p2; cin>>p1>>p2; p1--; p2--;

        int exp=(int)log2(p2-p1+1);

        int secv_min=min(rmq_min[exp][p1], rmq_min[exp][p2-(1<<exp)+1]);
        int secv_max=max(rmq_max[exp][p1], rmq_max[exp][p2-(1<<exp)+1]);

        frecv_secv.clear();
        for(int j=p1; j<=p2; j++){
            frecv_secv[rmq_min[0][j]]++;
        }

        if(secv_max-secv_min+1==p2-p1+1 && is_unique(frecv_secv)){
            cout<<1;
        }else{
            cout<<0;
        }
    }

    return 0;
}