Cod sursa(job #3253806)

Utilizator TheodosiusOancea Teodor Stefan Theodosius Data 4 noiembrie 2024 21:09:47
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#define min(a,b) (a<b?a:b)
int *aint,s,n;
void update(int ind,int val){
    ind=ind+s-1;
    aint[ind]=val;
    ind/=2;
    do{
        aint[ind]=min(aint[ind*2],aint[ind*2+1]);
        ind/=2;
    }while(ind>0);
};
void swap(int *a,int *b){
    int t=*a;
    *a=*b;
    *b=t;
};
int rasp(int a,int b){
    a=a+s-1;
    b=b+s-1;
    int r=INT_MAX;
    if(a>=b) swap(&a,&b);
    while(a<=b){
        if((a&1)==1){
            r=min(r,aint[a]);
            a++;
        };
        a/=2;
        if((b&1)==0){
            r=min(r,aint[b]);
            b--;
        };
        b/=2;
    };
    return r;
};
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int m,a,b,v;
    scanf("%d%d",&n,&m);
    double l=(double)(log2(n));
    s=(int)pow(2,(int)(l)+(int)(!(l==(int)l)));
    aint=(int *)calloc(s*2,sizeof(int));
    int p=s*2;
    for(int i=0;i<p;i++)
        aint[i]=INT_MAX;
    for(int i=0;i<n;i++)
    scanf("%d",&v),update(i+1,v);
    for(int i=0;i<m;i++){
        scanf("%d%d",&a,&b);
        printf("%d\n",rasp(a,b));
    };
    return 0;
}