Cod sursa(job #2567925)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 3 martie 2020 19:44:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define Dim 100001
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M,Tree[4*Dim],A[Dim],p,a,b,maxim;


void Init(int nod,int st,int dr)
{
    if(st==dr) Tree[nod]=A[st];
    else
    {
        int mij=(st+dr)>>1;
        Init( 2*nod , st , mij);
        Init( 2*nod+1,mij+1,dr);
        Tree[nod]=max(Tree[2*nod],Tree[2*nod+1]);
    }
}

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

void Query(int nod,int st,int dr)
{
    if( st>=a && dr<=b )
    {
        maxim=max(maxim,Tree[nod]);
        return;
    }
    int mij=(st+dr)>>1;
    if( a<=mij )
        Query(2*nod,st,mij);
    if( b > mij )
        Query(2*nod+1,mij+1,dr);

}

int main()
{
    f>>N>>M;
    for(int i=1;i<=N;i++)  f>>A[i];
    Init(1,1,N);

    for(int i=1;i<=M;i++)
    {
        f>>p>>a>>b;
        if(p==1) Update(1,1,N);
        else
        {
            maxim=0;
            Query(1,1,N);
            g<<maxim<<'\n';
        }

    }

    return 0;
}