Cod sursa(job #2983627)

Utilizator alexandrupopa11Alexandru alexandrupopa11 Data 22 februarie 2023 18:04:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m,v[100001],arbore[200001];

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

void update(int nod, int st, int dr, int a, int b)
{
    if(st == dr)
        arbore[nod] = b;
    else
    {
        int mid = (st+dr)/2;
        if(a <= mid)
            update(nod*2, st, mid, a,b);
        else
            update(nod*2+1, mid+1, dr, a,b);
        arbore[nod] = max(arbore[nod*2], arbore[nod*2+1]);
    }
}

int solve(int nod,int st,int dr,int a,int b)
{
    if(st >= a && dr <= b)
        return arbore[nod];

    int mid = (st+dr)/2;
    if(b <= mid)
        return solve(nod*2, st, mid, a,b);
    if(a > mid)
        return solve(nod*2+1, mid+1, dr, a,b);
    int x = solve(nod*2, st, mid, a,b);
    int y = solve(nod*2+1, mid+1, dr, a,b);
    return max(x,y);
}

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++)
    {
        int t,a,b;
        in>>t>>a>>b;
        if(t == 0)
            out<<solve(1,1,n,a,b)<<"\n";
        else
            update(1,1,n,a,b);
    }

    return 0;
}