Cod sursa(job #155664)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 12 martie 2008 02:27:11
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[100000],m[200002],mij,n,i,pozmin,p1,p2,j,mm,fact;
int inita(int nod, int b, int e)
{
  if (b==e)
   m[nod]=b;
    else
      {
       mij=(b+e)/2;
       inita(2*nod,b,mij);
       inita(2*nod+1,mij+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 s, int d)
{
 int vals,vald;
  if (e<s||d<b) return -1;
 else
  if (s<=b&&e<=d) return m[nod];
 else
 {
 mij=(b+e)/2;
 vals=query(2*nod,b,mij,s,d);
 vald=query(2*nod+1,mij+1,e,s,d);
 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]);
 }
 for(i=1;i<=2*n+1;i++)
  m[i]=-1;
 inita(1,1,n);
 for(j=1;j<=mm;j++)
  {
   scanf("%ld %ld",&p1,&p2);
   pozmin=query(1,1,n,p1,p2);
   printf("%ld\n",a[pozmin]);
  }
 return 0;
}