Cod sursa(job #1204549)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 3 iulie 2014 12:04:01
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#define infinite 1<<20
#include <algorithm>
using namespace std;
FILE *f=fopen("rmq.in","r");
FILE *g=fopen("rmq.out","w");
int n,m,adi[265001],pos,val,x,y;




inline int minim(int a,int b)
{if (a<b) return a;
return b;
}
inline void update(int st,int dr,int nod)
{if (st==dr) {adi[nod]=val;}
        else {int  mijl=(st+dr)>>1;
              if (pos<=mijl) update(st,mijl,nod*2);
                        else update(mijl+1,dr,nod*2+1);
              adi[nod]=minim(adi[nod*2],adi[nod*2+1]);
              }
}
inline void query(int st,int dr,int nod)
{if (x<=st&&dr<=y) val=minim(val,adi[nod]);
        else {int mijl=(st+dr)>>1;

              if (x<=mijl) query(st,mijl,nod* 2);
              if (y>=mijl+1) query(mijl+1,dr,nod*2+1);
                }
}





int main()
{int i,j;
fscanf(f,"%d %d",&n,&m);
for (i=1;i<=265000;i++) adi[i]=infinite;
for (i=1;i<=n;i++){fscanf(f,"%d",&j);
                   pos=i;val=j;
                   update(1,n,1);}
while (m!=0) {fscanf(f,"%d %d",&x,&y);
              val=infinite;
              query(1,n,1);
              fprintf(g,"%d\n",val);
               --m;}
return 0;
}