Cod sursa(job #3155121)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 7 octombrie 2023 13:14:45
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

#define MAX_N 100000

int v[MAX_N][17],max_put[MAX_N],n;

void const_sp(){
    int aux1,put,i,j;
    aux1=max_put[n];
    put=1;
    for(i=1;i<=aux1;i++){
        for(j=0;j+put*2-1<n;j++){//printf("%d:%d %d:%d]",i,j,v[j][i-1],v[j+put][i-1]);
            v[j][i]=min(v[j][i-1],v[j+put][i-1]);
        }
        put*=2;
    }
}


int main()
{
    int i,m,a,b,j,i1,len;
    cin>>n>>m;
    for(i=2;i<=MAX_N;i++){
        max_put[i]=max_put[i/2]+1;
    }
    for(i=0;i<n;i++){
        cin>>a;
        v[i][0]=a;//printf("(%d)",v[i][0]);

    }
    /*for(i1=0;i1<n;i1++){
        for(j=0;j<=max_put[n];j++)
            printf("%d  ",v[i1][j]);
        printf("\n");
    }
    printf("\n\n");*/
    const_sp();
    for(i=1;i<=m;i++){
        cin>>a>>b;
        a--;b--;
        len=b-a+1;
        //printf("------------\n");
        //printf("%d %d rez: %d\n",a,max_put[b-a+1],v[a][max_put[b-a+1]]);
       // printf("%d %d rez: %d\n",b-(1<<max_put[b-a+1]),max_put[b-a+1],v[a][max_put[b-a+1]]);
        cout<<min(v[a][max_put[len]],v[b-(1<<max_put[len])+1][max_put[len]])<<"\n";
    }
    return 0;
}