Cod sursa(job #2704967)

Utilizator maco1503Macovei Teodor-Andrei maco1503 Data 11 februarie 2021 18:20:24
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define rpd ios_base :: sync_with_stdio(0); cin.tie(0);
#define ll long long
#define fs first
#define sc second
#define pb push_back
#define mod 666013
#define NMAX 100000 + 100
using namespace std;

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

int aint[4 * NMAX], v[NMAX], n, q, poz, val, L, R, ans;

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

    int mid=(st+dr)/2;

    build(nod<<1,st,mid);
    build(nod<<1|1,mid+1,dr);

    aint[nod]=max(aint[nod<<1],aint[nod<<1|1]);

}

void update(int nod,int st,int dr)
{
    if(st==dr)
    {
        aint[nod]=val;
        return;
    }

    int mid=(st+dr)/2;

    if(poz<=mid)
        update(nod<<1,st,mid);
    else
        update(nod<<1|1,mid+1,dr);

    aint[nod]=max(aint[nod<<1],aint[nod<<1|1]);

}
void query(int nod,int st,int dr)
{
    if(L<=st&&R>=dr)
    {
        ans=max(ans,aint[nod]);
        return;
    }
    int mid=(st+dr)/2;

    if(L<=mid)
        query(nod<<1,st,mid);
    if(R>mid)
        query(nod<<1|1,mid+1,dr);
}
main()
{
    rpd;
    int n,q;
    in>>n>>q;
    for(int i=1;i<=n;++i)
        in>>v[i];
    build(1,1,n);
    while(q--)
    {
        int t;
        in>>t;
        if(t==0)
        {
            in>>L>>R;
            ans=0;
            query(1,1,n);
            out<<ans<<'\n';

        }
        else
        {
            in>>poz>>val;
            update(1,1,n);

        }
    }

}