Cod sursa(job #3213974)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 13 martie 2024 17:26:20
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

#define ll long long

//#define fin cin
//#define fout cout

using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

int aint[300005];

void update (int index, int val, int st, int dr, int curent)
{
    if (st==dr) {
        aint[curent]=val;
        return;
    }
    int mid=(st+dr)/2;
    if (index<=mid) update (index, val, st, mid, curent*2);
    else update (index, val, mid+1, dr, curent*2+1);
    aint[curent]=min(aint[curent*2], aint[curent*2+1]);
}
///1 5 6 4 3
int query (int x, int y, int a, int b, int curent)
{
    int mid=(x+y)/2;
    int min1=INT_MAX, min2=INT_MAX;
    if (a<=x&&y<=b) return aint[curent];
    if (a<=mid) min1=query(x, mid, a, b, curent*2);
    if (mid<b) min2=query(mid+1, y, a, b, curent*2+1);
    //cout<<a<<' '<<b<<' '<<min1<<' '<<min2<<endl;
    return min(min1, min2);
}

int main()
{
    fin.tie(0); fin.sync_with_stdio(false);
    int n, m; fin>>n>>m;
    for (int i=1; i<=3*n; i++) aint[i]=INT_MAX;
    for (int i=1; i<=n; i++) {
        int x; fin>>x;
        update(i, x, 1, n, 1);
        //for (int i=1; i<=3*n; i++) cout<<aint[i]<<' ';
        //cout<<endl;
    }
    //for (int i=1; i<=n; i++) cout<<query(1, n, i, i, 1)<<endl;
    for (int i=1; i<=m; i++) {
        int a, b; fin>>a>>b;
        fout<<query(1, n, a, b, 1)<<'\n';
    }
    return 0;
}