Cod sursa(job #1966713)

Utilizator mateibanuBanu Matei Costin mateibanu Data 15 aprilie 2017 15:19:27
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX 2000000

FILE*f=fopen("rmq.in","r");
FILE*g=fopen("rmq.out","w");

int v[100010],a[100010];
int n,m;

void adaug(int p, int x){
    int b;
    while (p<=n){
        v[p]=min(v[p],x);
        b=(p^(p-1))&p;
        p+=b;
    }
}

int  minim(int x,int y){
    int i,b,mx=MAX,my=MAX,p;
    p=x;
    while (p>0){
        mx=min(v[p],mx);
        b=(p^(p-1))&p;
        p-=b;
    }
    p=y;
    while (p>0){
        my=min(v[p],my);
        b=(p^(p-1))&p;
        p-=b;
    }
    if (my>mx) return my;
    else {
        my=MAX;
        for (i=x;i<=y;i++) if (a[i]<my) my=a[i];
        return my;
    }
}

int main()
{
    int i,x,y;
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=n;i++)v[i]=MAX;
    for (i=1;i<=n;i++){
        fscanf(f,"%d",&a[i]);
        adaug(i,a[i]);
    }
    for (i=1;i<=m;i++){
        fscanf(f,"%d%d",&x,&y);
        fprintf(g,"%d\n",minim(x,y));
    }
    fclose(f);
    fclose(g);
    return 0;
}