Cod sursa(job #1300917)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 25 decembrie 2014 03:30:04
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
#include <cstring>
#define INF 10000000
using namespace std;

int v[800000],n,i,m,maxim,a,b;
int max(int x,int y){
    if(x>y)
        return x;
    return y;
}
void build(int nod,int p,int u){
    if(p==u){
        scanf("%d",&v[nod]);
        return;
    }
    int mid=(p+u)/2;
    build(2*nod,p,mid);
    build(2*nod+1,mid+1,u);
    v[nod]=max(v[2*nod],v[2*nod+1]);
}
void query(int nod,int p,int u,int a,int b){
    if(p>=a && u<=b){
        maxim=max(maxim,v[nod]);
        return;
    }
    int mid=(p+u)/2;
    if(a<=mid && v[2*nod]>maxim)
        query(2*nod,p,mid,a,b);
    if(b>mid && v[2*nod+1]>maxim)
        query(2*nod+1,mid+1,u,a,b);
}
int main(){
    freopen ("rmq.in","r",stdin);
    freopen ("rmq.out","w",stdout);
    scanf("%d%d",&n,&m);
    build(1,1,n);
    for(i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        maxim=-INF;
        query(1,1,n,a,b);
        printf("%d\n",maxim);
    }
    return 0;
}