Cod sursa(job #2129268)

Utilizator AvramDanielAvram Daniel AvramDaniel Data 12 februarie 2018 17:54:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");
 int n,m,a,b;
 int v[100000],arbint[200020];
bool cer;

void build(int nod, int st,int dr)
{
    if(st==dr)
    {
        arbint[nod]=v[st];

    }
    else{
    int mid=(st+dr)/2;
    build(nod*2,st,mid);
    build(nod*2+1,mid+1,dr);
    arbint[nod]=max(arbint[nod*2],arbint[nod*2+1]);
    }
}

void update(int nod,int st,int dr,int index,int newvalue)
{
    if(st==dr)
    {
        arbint[nod]=newvalue;
        return;
    }
    int mid=(st+dr)/2;
    if(index<=mid) update(nod*2,st,mid,index,newvalue);
    else update(nod*2+1,mid+1,dr,index,newvalue);
    arbint[nod]=max(arbint[nod*2],arbint[nod*2+1]);

}

int query(int nod,int st,int dr, int left, int right)
{
    if(st==left && dr==right)
        return arbint[nod];
    int mid=(st+dr)/2;
    if(right<=mid)
        return query(nod*2,st,mid,left,right);
    else if(left>mid)
        return query(nod*2+1,mid+1,dr,left,right);
    else return max(query(nod*2,st,mid,left,mid),query(nod*2+1,mid+1,dr,mid+1,right));
}
int main()
{
    in>>n>>m;

    for(int i=1;i<=n;i++)
    {
        in>>v[i];
    }

    build(1,1,n);

    for(int i=1;i<=m;i++)
    {
        in>>cer>>a>>b;
        if(cer){
            update(1,1,n,a,b);

        }
        else {out<<query(1,1,n,a,b)<<'\n'; }
    }
    return 0;
}