Cod sursa(job #3155223)

Utilizator GrigMihaiGrigore Mihai GrigMihai Data 7 octombrie 2023 18:11:33
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>

using namespace std;

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

struct SegTree {
    int* v;
    int n;

    SegTree(int num) : n(num) {
        v= new int[4*num+1];
        for(int i=0;i<=4*num;i++)
            v[i]=INT_MAX;
    }

    ~SegTree() { delete[] v; }

    void insert(int pos, int x, int node, int left, int right)
    {
        if(left==right)
        {
            v[node]=x;
            return;
        }

        int mid=(left+right)/2;

        if(pos<=mid)
            insert(pos, x, 2*node, left, mid);
        else
            insert(pos, x, 2*node+1, mid+1, right);

        v[node]=min(v[2*node], v[2*node+1]);
    }

    int query(int a, int b, int node, int left, int right)
    {
        if(a==left&&b==right)
            return v[node];

        int mid=(left+right)/2;

        int x=INT_MAX, y=INT_MAX;

        if(a<=mid)
            x=query(a, min(mid, b), 2*node, left, mid);
        if(b>mid)
            y=query(max(mid+1, a), b, 2*node+1, mid+1, right);

        return min(x, y);
    }
};


int main() {

    int n, m;
    in>>n>>m;
    SegTree segTree(n);
    for(int i=1;i<=n;i++)
    {
        int x;
        in>>x;
        segTree.insert(i, x, 1, 1, n);
    }

    while(m)
    {
        m--;
        int a, b;
        in>>a>>b;

        out<<segTree.query(a, b, 1, 1, n)<<'\n';
    }

    return 0;
}