Cod sursa(job #2516386)

Utilizator OvidRata Ovidiu Ovid Data 31 decembrie 2019 11:15:01
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define sc second
#define ft first
ifstream fin("rmq.in"); ofstream fout("rmq.out");
 
 
 
int A[100010], N, M;
short int a,b;
int T[400010];
 
 
long long construct(int l, int r, int nod){
    
    if(r==l){T[nod]=A[r];}
    else{int mij=l+r; mij/=2;
        T[nod]=min(construct(l, mij, nod*2), construct(mij+1, r, 2*nod+1) );}
 
     return T[nod];
} 
 
 
 
 
int minimum(int n, int al, int ar, int l, int r){
    if(l>r){return 2000000007;}
    
    if(al==l && ar==r){return T[n];}
    
    int mij=ar+al; mij/=2;
    return min(minimum(2*n, al, mij, l, min(mij,r)), minimum(2*n+1, mij+1, ar, max(l, mij+1), r) ) ;
}
 
 
 
 
 
void update(int n, int al, int ar, int p, int v){
    if(ar==al){T[n]=v;}
    else{
    int mij=ar+al; mij/=2;
    
    if(p<=mij){
        update(2*n, al, mij, p, v);
    }
    else{
        update(2*n+1, mij+1, ar, p, v);
    }
    T[n]=min(T[2*n], T[2*n+1]);
    }
    
}
 
 
 
 
 
int main() {
cin>>N>>M;
 
for(int i=1; i<=N; i++){
    cin>>A[i];
}
 
construct(1, N, 1);
 
for(;M;M--){
cin>>a>>b;
cout<<minimum(1, 1, N, a, b)<<"\n";
}
 
return 0;
}