Cod sursa(job #2724282)

Utilizator AndiAndi39Sabo Andrei Claudiu AndiAndi39 Data 16 martie 2021 21:03:03
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include<iostream>
#include<fstream>
#include<climits>

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

#define nrm 100005
int n,m;
int tree[4*nrm];

void add(int node, int left, int right, int val, int pos)
{
    if(left==right)
    {
        tree[node]=val;
        return;
    }
    int mij=(left+right)/2;
    if(pos<=mij)
    {
        add(2*node,left,mij,val,pos);
    }
    else
    {
        add(2*node+1,mij+1,right,val,pos);
    }
    tree[node]=min(tree[2*node],tree[2*node+1]);
}

int query(int node, int left, int right, int intervall, int intervalr)
{
    if(intervall<=left && right<=intervalr)
    {
        return tree[node];
    }
    int mij=(left+right)/2;
    int ml=INT_MAX,mr=INT_MAX;
    if(mij>=intervall)
    {
        ml=query(2*node,left,mij,intervall,intervalr);
    }
    if(mij<intervalr)
    {
        mr=query(2*node+1,mij+1,right,intervall,intervalr);
    }
    return min(ml,mr);
}

void read()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        fin>>x;
        add(1,1,n,x,i);
    }
    for(int i=1;i<=m;i++)
    {
        int a,b;
        fin>>a>>b;
        fout<<query(1,1,n,a,b)<<'\n';
    }
}

int main()
{
    read();
    fin.close();
    fout.close();
    return 0;
}