Cod sursa(job #2624840)

Utilizator AvramDanielAvram Daniel AvramDaniel Data 5 iunie 2020 15:38:42
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 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 querry(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 querry(nod*2,st,mid,left,right);

    else if(left>mid)
        return querry(nod*2+1,mid+1,dr,left,right);

    else return max(querry(nod*2,st,mid,left,mid),querry(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<<querry(1,1,n,a,b)<<'\n'; }
    }
    return 0;
}