Pagini recente » Cod sursa (job #126878) | Cod sursa (job #1077340) | Cod sursa (job #1153499) | Cod sursa (job #525684) | Cod sursa (job #593822)
Cod sursa(job #593822)
/*varianta cu arbori de intervale*/
#include <cstdio>
const int ARB = 1<<18;
const int N = 100005;
const int INF = 2000000000;
int arb[ARB];
int poz_frunza[N]; int n;
inline int min(int a, int b)
{
return (a<b)?a:b;
}
int x,y;
void create(int a, int b, int poz)
{
arb[poz] = INF;
if (a == b)
{
poz_frunza[a] = poz;
return;
}
int mij = (a+b)/2;
create(a,mij,2*poz);
create(mij+1,b,2*poz+1);
}
inline void creare()
{
create(1,n,1);
}
int query(int a, int b, int poz)
{
if ((x <= a)&&(b <= y))//inclus complet
return arb[poz];
if ((b < x)||(y < a))//inutil
return INF;
int mij = (a+b)/2;
return min( query(a,mij,2*poz) , query(mij+1,b,2*poz+1) );
}
int interogare(int poz_x, int poz_y)
{
x = poz_x;
y = poz_y;
return query(1,n,1);
}
void actualizare(int i, int val)
{
int poz = poz_frunza[i];
arb[poz] = val;
poz /= 2;
while (poz > 0)
{
arb[poz] = min(arb[2*poz],arb[2*poz+1]);
poz /= 2;
}
}
int m;
void adaugare_valori()
{
int val;
for (int i = 1; i <= n; ++i)
{
scanf("%d",&val);
actualizare(i,val);
}
}
void raspundere()
{
int a,b;
for (int i = 1; i <= m; ++i)
{
scanf("%d%d",&a,&b);
printf("%d\n",interogare(a,b));
}
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
creare();
adaugare_valori();
raspundere();
return 0;
}