Cod sursa(job #2922230)

Utilizator EasyTnsEasyTns EasyTns Data 6 septembrie 2022 19:04:29
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
//varianta arbori intervale cu alocare dinamica
//Arseni Costel, Colegiul National Mihail Sadoveanu Pascani
//Costel Ionut pe facebook :))))
#include<fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
struct nod
{
    int info=(1<<30);
    nod *st,*dr;
};
int minim;
void actualizare(nod *&rad,int val,int st,int dr,int pos)
{
    if(rad==NULL)
    {
        rad=new nod;
        rad->st=NULL;
        rad->dr=NULL;
    }

    if(st==dr)
    {
        rad->info=val;

        return;
    }
    int mij=(st+dr)/2;
    if(pos<=mij)
    {actualizare(rad->st,val,st,mij,pos);}
    else
    {actualizare(rad->dr,val,mij+1,dr,pos);}

    if(rad->st==NULL)
        rad->info=rad->dr->info;
    else    if(rad->dr==NULL)
        rad->info=rad->st->info;
    else
        rad->info=min(rad->st->info,rad->dr->info);
}
void interogare(nod*rad,int st,int dr,int start,int finish)
{

    if(start<=st&&dr<=finish)
    {
        if(minim>rad->info)
            minim=rad->info;
        return ;
    }
    int mij=(st+dr)/2;
    if(start<=mij)
        interogare(rad->st,st,mij,start,finish);
    if(mij<finish)
        interogare(rad->dr,mij+1,dr,start,finish);
}
int main()
{
    int n,m,x,y,z;
    cin>>n>>m;

    nod*rad=NULL;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        actualizare(rad,x,1,n,i);
    }


    for(;m;m--)
    {
        cin>>y>>z;

            minim=1<<30;
            interogare(rad,1,n,y,z);
            cout<<minim<<'\n';

    }
}