Cod sursa(job #345924)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 5 septembrie 2009 17:05:15
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
//arbori de intervale
//log n pe query -> minim pe interval <-
#include<stdio.h>
int a[100002],m[1000000],mij,n,i,pozmin,p1,p2,j,mm,fact;
int inita(int nod, int b, int e)
{
  if (b==e)
   m[nod]=b;
    else
      {
       inita(2*nod,b,(b+e)/2);
       inita(2*nod+1,(b+e)/2+1,e);
       if (a[m[2*nod+1]]>a[m[2*nod]]) m[nod]=m[2*nod];
                                 else m[nod]=m[2*nod+1];
       }
 return 0;
}
int query(int nod,int b, int e)
{
 int vals,vald;
  if (e<p1||p2<b) return -1;
 else
  if (p1<=b&&e<=p2) return m[nod];
 else
 {
     if (p1 <= (b + e) / 2) vals = query(2*nod,b,(b+e)/2);
     if (p2 > (b + e) / 2) vald = query(2*nod+1,(b+e)/2+1,e);
 if (vals==-1) return vald;
 if (vald==-1) return vals;
 if (a[vals] < a[vald]) return vals;
           else return vald;
  }
}
int main()
{
 freopen("rmq.in","r",stdin);
 freopen("rmq.out","w",stdout);
 scanf("%ld %ld",&n,&mm);
 for(i=1;i<=n;i++)
 {
  scanf("%ld",&a[i]);
 }
 inita(1,1,n);
 for(j=1;j<=mm;j++)
  {
   scanf("%ld %ld",&p1,&p2);
   pozmin=query(1,1,n);
   printf("%ld\n",a[pozmin]);
  }
 return 0;
}