Pagini recente » Cod sursa (job #974668) | Cod sursa (job #1778762) | Cod sursa (job #2164473) | Cod sursa (job #2623634) | Cod sursa (job #370305)
Cod sursa(job #370305)
#include<stdio.h>
#define infile "rmq.in"
#define outfile "rmq.out"
#define nmax (200*1001)
#define inf ~(1<<31)
int arb[nmax]; //arborele
int n; //numarul de elemente
int poz,val; //pentru un update
int a,b; //interval cautare
inline int min(int a, int b)
{
if(a<b) return a; return b;
}
void update(int rad, int st, int dr)
{
if(st==dr) { arb[rad]=val; return; }
int mij=(st+dr)>>1;
arb[rad]=inf;
if(poz<=mij && (rad<<1)<nmax) update(rad<<1,st,mij);
if(mij<poz && ((rad<<1)|1)<nmax) update((rad<<1)|1,mij+1,dr);
if((rad<<1)<nmax && arb[rad<<1]<arb[rad]) arb[rad]=arb[rad<<1];
if(((rad<<1)|1)<nmax && arb[(rad<<1)|1]<arb[rad]) arb[rad]=arb[(rad<<1)|1];
}
int query(int rad, int st, int dr)
{
if(a<=st && dr<=b) return arb[rad];
int mij=(st+dr)>>1;
int val=inf;
if(a<=mij && (rad<<1)<nmax) val=min(val,query(rad<<1,st,mij));
if(mij<b && ((rad<<1)|1)<nmax) val=min(val,query((rad<<1)|1,mij+1,dr));
return val;
}
int main()
{
int t;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
scanf("%d %d\n",&n,&t);
//citim sirul initial
for(poz=1;poz<=n;poz++)
{
scanf("%d\n",&val);
update(1,1,n);
}
//raspundem la query-uri
while(t--)
{
scanf("%d %d\n",&a,&b);
printf("%d\n",query(1,1,n));
}
fclose(stdin);
fclose(stdout);
return 0;
}