Cod sursa(job #2521250)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 10 ianuarie 2020 16:56:20
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
#define Dim 100001
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M,op,a,b,Tree[4*Dim+2],V[Dim];

void Init(int nod,int st,int dr,int V[]) // initializeaza maximul pe intervalus [st,dr]
{
    if(st==dr)  Tree[nod]=V[st];
    else
    {
        int mij=(st+dr)>>1;
        Init( (1<<nod) ,st,mij,V );
        Init( (1<<nod) + 1 ,mij+1,dr,V );
        Tree[nod]=max(Tree[(1<<nod)],Tree[(1<<nod)+1]);
    }

}

void Update(int nod,int st,int dr)
{
    if( st==dr ) Tree[nod]=b;
    else
    {
        int mij=(st+dr)>>1;
        if( a<=mij )
        Update( 1<<nod , st,mij );
        else
        Update( (1<<nod) + 1 ,mij+1,dr );
        Tree[nod]=max(Tree[ 1<<nod ],Tree[ (1<<nod) + 1 ]);
    }
}

void Query(int nod,int st,int dr,int &maxim) // returneza maximiul din intervalul [st,dr] inclus in [a,b]
{
   if( st>=a && dr<=b ) maxim=max(maxim,Tree[nod]);
   else
   {
       int mij=(st+dr)>>1;
       if( a<=mij ) Query( 1<<nod ,st,mij,maxim);
       if( b > mij ) Query( (1<<nod)+1,mij+1,dr,maxim );
   }


}

int main()
{
    f>>N>>M;
    for(int i=1;i<=N;i++) f>>V[i];
    Init(1,1,N,V);
    //  for(int i=1;i<=4*N+1;i++) cout<<Tree[i]<<" "<<i<<'\n';
    for(int i=1;i<=M;i++)
    {
        f>>op>>a>>b;
        if(!op)
        {
            int maxim=0;
            Query(1,1,N,maxim);
            g<<maxim<<'\n';
        }
        else
        Update(1,1,N);
    }


    return 0;
}