Cod sursa(job #2754944)

Utilizator mirunavrAvram Miruna-Alexandra mirunavr Data 26 mai 2021 18:07:33
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.62 kb
///TEST
#include <iostream>
#include <fstream>
using namespace std;

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

int arbint[400005];
int v;
int n, q, x, y;

void Update( int nod, int st, int dr, int pos, int val )
{
    if( st == dr )
    {
        arbint[nod] = val;
        return;
    }
    int mid = st + ( dr - st )/2;
    if(pos <= mid) Update( nod * 2, st, mid, pos, val );
    else Update( nod * 2 + 1, mid + 1, dr, pos, val );
    arbint[nod] = max( arbint[nod*2], arbint[nod*2+1] );
}

int Query( int nod, int st, int dr, int L, int R )
{
    if( L <= st && dr <= R )
        return arbint[nod];
    int mid = st + ( dr - st )/2;
    int ans1,ans2;
    ans1 = ans2 = -100005;
    if( L <= mid ) ans1 = Query( nod*2, st, mid, L, R );
    if( mid < R ) ans2 = Query( nod*2+1, mid+1, dr, L, R);
    return max(ans1, ans2 );
}

int main()
{
    in>>n>>q;
    for( int i=1;i<=n;++i)
    {
        in >> v;
        Update( 1, 1, n, i, -v );
    }
    for( int i=1;i<=q;++i)
    {
        in>> x >> y;
        out << -1*Query( 1, 1, n, x, y ) << '\n';

    }
}
//am reutilizat codul de la arbori de intervale
/*
#include<bits/stdc++.h>
using namespace std;

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

//const int N_max= 100000;
int MaxArb[400001],start,finish,n,m,nr,val;

void Update(int nod, int left, int right,int pos,int val)
{
    if ( left == right )
    {
        MaxArb[nod] = val;
        return;
    }
    int middle = left+ (right-left)/2;
    if ( pos <= middle )
        Update(2*nod,left,middle,pos,val);
    else
        Update(2*nod+1,middle+1,right,pos,val);
    MaxArb[nod] = max(MaxArb[2*nod], MaxArb[2*nod+1]);
}


int Query_max(int nod, int left,int right,int limitleft,int limitright)
{

    /*if (left > right || left>limitright || right < limitleft)
        return;*/
/*    if(limitleft<=left && right<=limitright)
    {
        return MaxArb[nod];
    }

    int middle= left+(right-left)/2;
    int Left,Right;
    Left=Right=-100001;
    //=-100001;
    if(limitleft<=middle)
        Left=Query_max(2*nod,left,middle,limitleft,limitright);
    if(middle<limitright)
        Right=Query_max(2*nod+1,middle+1,right,limitleft,limitright);
    return max(Left,Right);
}

int main()
{
    //adaugam numerele cu minus si interogam maximul
    f>>n>>m;
    for(int i=1; i<=n; ++i)
    {
        f>>nr;
        Update(1,1,n,i,-nr);
    }

    for(int i=1; i<=m; ++i)
    {
        f>>start>>finish;
        g<<-1*Query_max(1,1,n,start,finish)<<'\n';
        //Query_max(1,1,n,start,finish,maxim);
        //g<<-maxim<<'\n';

    }
}
*/