Cod sursa(job #3002649)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 14 martie 2023 22:43:21
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <algorithm>

///<PRACTICE>

using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

const int NMAX=1e5+5;
const int INF=-2e9;

int v[NMAX];
int aint[4*NMAX];

void build(int p,int st,int dr)
{
    int mij;
    if(st==dr)
    {
        aint[p]=v[st];
        return ;
    }
    else
    {
        mij=st+dr;
        mij/=2;
        build(2*p,st,mij);
        build(2*p+1,mij+1,dr);
        aint[p]=max(aint[2*p],aint[2*p+1]);
    }
}

void update(int p,int st,int dr,int a,int b)
{
        int mij;
        if(st==dr)
        {
            aint[p]=b;
            return ;
        }
        else
        {
            mij=st+dr;
            mij/=2;
            if(a<=mij)
                update(2*p,st,mij,a,b);
            else
                update(2*p+1,mij+1,dr,a,b);
            aint[p]=max(aint[2*p+1],aint[2*p]);
        }
}

int query(int p,int st,int dr,int l,int r)
{
    int mij,a,b;
    if(l<=st && dr<=r)
        return aint[p];
    else
    {
        int a=INF,b=INF;
        mij=st+dr;
        mij/=2;
        if(l<=mij)
            return query(2*p,st,mij,l,r);
        if(mij<r)
            return query(2*p+1,mij+1,dr,l,r);
        return max(aint[2*p],aint[2*p+1]);
    }
}

int main()
{
    int n,i,j,q;
    fin>>n>>q;
    for(i=1;i<=n;i++)
        fin>>v[i];
    build(1,1,n);
    while(q--)
    {
        int t,x,y;
        fin>>t>>x>>y;
        if(t==0)
            fout<<query(1,1,n,x,y)<<"\n";
        else
            update(1,1,n,x,y);
    }
    return 0;
}