Cod sursa(job #2019760)

Utilizator NashikAndrei Feodorov Nashik Data 8 septembrie 2017 14:35:27
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
using namespace std;
int val[400005];
int query(int nod,int a,int b,int x,int y)
{
    if(b<x or a>y)
    {
        return 0;
    }
    if(b<=y and a>=x)
        return val[nod];
    return(max(query(nod*2,a,(a+b)/2,x,y),query(2*nod+1,(a+b)/2+1,b,x,y)));
}
void update(int nod,int a,int b,int v,int pos)
{
    if(pos<a or pos>b)
    {
        return;
    }
    if(a==b)
    {
        val[nod]=v;
        return;
    }
    update(nod*2,a,(a+b)/2,v,pos);
    update(2*nod+1,(a+b)/2+1,b,v,pos);
    val[nod]=max(val[2*nod],val[2*nod+1]);
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int n,m,v,cer,a,b;;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>v;
        update(1,1,n,v,i);
    }
    for(int i=1;i<=m;i++)
    {
        cin>>cer>>a>>b;
        if(cer==0)
            cout<<query(1,1,n,a,b) << '\n';
        else
            update(1,1,n,b,a);
    }

    return 0;
}