Cod sursa(job #688638)

Utilizator EstarDaian Dragos Estar Data 23 februarie 2012 18:38:15
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>
#include <iostream>

using namespace std;

int sir[500000], x , y, e,Min;

void rmq1(int i , int j , int pos) {
    sir[pos]=min(e,sir[pos]);
    if(i==j)return;
    if(x<=(i+j)/2)
        rmq1(i,(i+j)/2,pos*2);
    if(x>(i+j)/2)
        rmq1((i+j)/2+1,j,pos*2+1);
}

void rmq2(int i , int j , int pos) {
    if(x<=i&&y>=j){
        Min=min(sir[pos],Min);
        return;
    }
    if(i==j)return;
    if(x<=(i+j)/2)
        rmq2(i,(i+j)/2,pos*2);
    if(y>(i+j)/2)
        rmq2((i+j)/2+1,j,pos*2+1);
}

int main() {
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int n , m ;
    scanf("%d%d",&n,&m);
    for(int i=1; i<100000; i++)
        sir[i]=200000000;
    for(int i=1; i<=n; i++) {
        scanf("%d",&e);
        x=i;
        rmq1(1,n,1);
    }
    for(int i=1; i<=m; i++) {
        scanf("%d%d",&x,&y);
        Min=200000000;
        rmq2(1,n,1);
        printf("%d\n",Min);
    }
}