Cod sursa(job #3253804)

Utilizator TheodosiusOancea Teodor Stefan Theodosius Data 4 noiembrie 2024 21:04:13
Problema Range minimum query Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.23 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<<1],aint[(ind<<1)+1]);
        ind=(ind>>1);
    }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=a>>1;
        if((b&1)==0){
            r=min(r,aint[b]);
            b--;
        };
        b=b>>1;
    };
    r=min(aint[a],r);
    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<<1,sizeof(int));
    int p=s<<1;
    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;
}