Cod sursa(job #2616907)

Utilizator cpopescu1Popescu Cristian cpopescu1 Data 20 mai 2020 11:36:39
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
using namespace std;

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

int n,m;
int arbINT[100005],A[100005],maxim;

void build(int nod,int st,int dr) //construim arborele
{
    if(st==dr){
        arbINT[nod]=A[st];
        return;
    }
    else
    {
        int mij=(st+dr)/2;
        build(nod*2,st,mij);
        build(nod*2+1,mij+1,dr);
        arbINT[nod]=max(arbINT[nod*2],arbINT[nod*2+1]);
    }
}

void update(int nod,int st,int dr,int poz,int val)
{
    if(st==dr)
    {
        arbINT[nod]=val;
        return;
    }
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij)
            update(nod*2,st,mij,poz,val);
        else update(nod*2+1,mij+1,dr,poz,val);
        arbINT[nod]=max(arbINT[nod*2],arbINT[nod*2+1]);
    }
}

int query(int nod,int st,int dr,int sti,int dri)
{
    if(sti<=st && dr<=dri)
        return arbINT[nod];
    int maxim=0,mij=(st+dr)/2;
    if(sti<=mij)
        maxim=max(maxim,query(nod*2,st,mij,sti,dri));
    if(dri>mij)
        maxim=max(maxim,query(nod*2+1,mij+1,dr,sti,dri));
    return maxim;
}

int main()
{
    ios::sync_with_stdio(0);
    fin.tie(0);
    fin>>n>>m;
    for(int i=1;i<=n;i++) fin>>A[i];
    build(1,1,n);
    int op,a,b;
    for(int i=1;i<=m;i++)
    {
        fin>>op>>a>>b;
        if(op==0)
            fout<<query(1,1,n,a,b)<<"\n";
        else if(op==1)
            update(1,1,n,a,b);
    }
    fin.close();
    fout.close();
    return 0;
}