Cod sursa(job #2767621)

Utilizator puica2018Puica Andrei puica2018 Data 6 august 2021 23:40:02
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m;
int a[200005],aint[400005];
int t,l,r;

int sz=1;

void update(int node,int from,int to,int p,int v)
{
    if(to<p || from>p)
        return;
    if(from==to)
    {
        aint[node]=v;
        return;
    }
    int mid=(from+to)/2;
    update(2*node,from,mid,p,v);
    update(2*node+1,mid+1,to,p,v);
    aint[node]=max(aint[2*node],aint[2*node+1]);
}

int query(int node,int from,int to,int a,int b)
{
    if(to<a || from>b)
        return 0;
    if(from>=a && to<=b)
        return aint[node];
    int mid=(from+to)/2;
    return max(query(2*node,from,mid,a,b),query(2*node+1,mid+1,to,a,b));
}

int main()
{
    fin>>n>>m;
    int i;
    for(i=1; i<=n; i++)
        fin>>a[i];
    while(sz<n)
        sz*=2;
    for(i=1; i<=sz; i++)
        aint[i+sz-1]=a[i];
    for(i=sz-1; i>=1; i--)
        aint[i]=max(aint[2*i],aint[2*i+1]);
    while(m--)
    {
        fin>>t>>l>>r;
        if(t==0)
            fout<<query(1,1,sz,l,r)<<"\n";
        else
        {
            update(1,1,sz,l,r);
        }
    }
    return 0;
}