Cod sursa(job #2891094)

Utilizator Mendea_IanisMendea Ianis Teodor Mendea_Ianis Data 17 aprilie 2022 15:30:11
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;

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

const int maxn = 100005;

int n,m,c,a,b,A[4*maxn],V[maxn];

void build(int nod,int st, int dr)
{
    if(st == dr)
    {
        A[nod] = V[st];
        return;
    }

    int mid = (st+dr)/2;

    build(2*nod,st,mid);
    build(2*nod+1,mid+1,dr);

    A[nod] = max(A[2*nod],A[2*nod+1]);
}

int query(int nod,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
    {
        return A[nod];
    }

    int mid = (st+dr)/2;

    int maxim = INT_MIN;

    if(a<=mid) maxim = max(maxim,query(2*nod,st,mid,a,b));

    if(b>=mid+1) maxim = max(maxim,query(2*nod+1,mid+1,dr,a,b));

    return maxim;
}

void update(int nod,int st, int dr,int a,int b)
{
    if(st == dr)
    {
        A[nod] = b;
        return;
    }

    int mid = (st+dr)/2;

    if(a<=mid)
    {
        update(2*nod,st,mid,a,b);
    }
    else{
        update(2*nod+1,mid+1,dr,a,b);
    }

    A[nod] = max(A[2*nod],A[2*nod+1]);
}

int main()
{
    fin>>n>>m;

    for(int i = 1;i<=n;i++)
        fin>>V[i];

    build(1,1,n);
    for(int i = 1;i<=m;i++)
    {
        fin>>c;
        fin>>a;
        fin>>b;

        if(c==0)
        {
            fout<<query(1,1,n,a,b)<<'\n';
        }
        else{
            update(1,1,n,a,b);
        }
    }
}