Cod sursa(job #3181579)

Utilizator razviOKPopan Razvan Calin razviOK Data 7 decembrie 2023 12:57:38
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 kb
#include <stdio.h>
#include <stdlib.h>

int Minimum(int a,int b){
    return (a<b) ? a:b;
}
void DynamicProgrammingSolution(int *arr,int N,int M) {

    int **Dp = (int **) malloc(sizeof(int *) * N);
    for (int i = 0; i < N; i++) {
        Dp[i] = (int *) malloc(sizeof(int) * (N - i));
    }

    for (int i = 0; i < N; i++)
        for (int j = 0; j < N - i; j++) {
            if (j == 0) Dp[i][j] = arr[i];
            else Dp[i][j] = Minimum(Dp[i][j - 1], arr[i+j]);
        }
//    for (int i = 0; i < N; i++){
//        for (int j = 0; j < N - i; j++)
//            printf("%d ",Dp[i][j]);
//        printf("\n");
//}


    int a,b;
    for(int i=0;i<M;i++){
        scanf("%d",&a);
        scanf("%d",&b);
        printf("%d\n",Dp[a-1][b-a]);
    }

    for(int i=0;i<N;i++) {
        free(Dp[i]);
    }

    free(Dp);



}
void SquareRootDecomposition(int *arr,int N,int M){

    int square_root,size;
    for(square_root=1;square_root*square_root<=N;square_root++);
    square_root--;
    //printf("%d",square_root);
    size=square_root;

    if(square_root*square_root!=N)
        size++;


    int *SqrArr = (int *) malloc(sizeof(int) * size);

    int cnt=-1;
    for(int i=0;i<N;i++){
     if(i%square_root==0){
         cnt++;
         SqrArr[cnt]=arr[i];
     }
     else SqrArr[cnt]= Minimum(SqrArr[cnt],arr[i]);
    }

    int a,b,min=INT_MAX;
    for(int q=0;q<M;q++){
        min=INT_MAX;
        scanf("%d",&a);
        scanf("%d",&b);
        a-=1;
        b-=1;
        for(int it=a;it<=b;it++){
            if(it%square_root==0 && it+square_root-1<=b) {
                min = Minimum(min, SqrArr[it/square_root]);
                it+=square_root;
                it--;
            }
            else min= Minimum(min,arr[it]);
        }
        printf("%d\n",min);

    }

//    for(int i=0;i<size;i++)
//        printf("%d ",SqrArr[i]);
    free(SqrArr);

}
void RangeMinimumQuery(int *arr,int N,int M){

}
int main() {

    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);

    int N,M;
    scanf("%d",&N);
    scanf("%d",&M);
    int *arr=(int *) malloc(sizeof(int)*N);
    for(int i=0;i<N;i++)
        scanf("%d",&arr[i]);

    //DynamicProgrammingSolution(arr,N,M);
    SquareRootDecomposition(arr,N,M);

    free(arr);
    return 0;
}