Cod sursa(job #2754440)

Utilizator mirunavrAvram Miruna-Alexandra mirunavr Data 25 mai 2021 20:23:20
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include<bits/stdc++.h>
using namespace std;

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

const int N_max= 100000;
int MaxArb[4*N_max+1],start,finish,n,m,bonus,com,nr,val,pozitie;

void Update(int nod, int left, int right,int pos,int val)
{
    if ( left == right )
    {
        MaxArb[nod] = val;
        return;
    }
    int middle = (left+right)/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]);
}


void Query_max(int nod, int left,int right,int limitleft,int limitright,int &maxim)
{

    /*if (left > right || left>limitright || right < limitleft)
        return;*/

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

    int middle= (left+right)/2;
    if(limitleft<=middle)
        Query_max(2*nod,left,middle,limitleft,limitright,maxim);
    if(middle<limitright)
        Query_max(2*nod+1,middle+1,right,limitleft,limitright,maxim);
}
void UpdateVal(int nod,int left,int right, int pozitie, int val)
{
    if(left==right){
        MaxArb[nod]=val;
        return;
    }
    else{
         int middle= (left+right)/2;
         if(pozitie<=middle)
    UpdateVal(2*nod,left,middle,pozitie,val);
    else
    UpdateVal(2*nod+1,middle+1,right,pozitie,val);
    MaxArb[nod]= max(MaxArb[2*nod],MaxArb[2*nod+1]);
    }

}

int main()
{
    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>>com;
        if(com == 0)
        {
            f>>start>>finish;
            int maxim=-1;
            Query_max(1,1,n,start,finish,maxim);
            g<<maxim<<'\n';
        }
        else
        {
            f>>pozitie;
            f>>val;
            UpdateVal(1,1,n,pozitie,val);
        }
    }
    return 0;
}