Cod sursa(job #2158094)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 10 martie 2018 10:27:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <cstdio>
using namespace std;
int m,n,tip,aux1,aux2,vCit[100005];
int arbint[400005];
void build(int st,int dr,int idx)
{
    if(st==dr)
    {
        arbint[idx]=vCit[st];
        return;
    }
    int mij=(st+dr)/2;
    build(st,mij,2*idx);
    build(mij+1,dr,2*idx+1);
    arbint[idx]=max(arbint[2*idx],arbint[2*idx+1]);
}
int sol;
void query(int st,int dr,int ST,int DR,int idx)
{
    if(ST<=st&&dr<=DR)
    {
        sol=max(sol,arbint[idx]);
        return;
    }
    int mij=(st+dr)/2;
    if(ST<=mij)
        query(st,mij,ST,DR,2*idx);
    if(DR>mij)
        query(mij+1,dr,ST,DR,2*idx+1);
}
void update(int poz,int nr,int st,int dr,int idx)
{
    if(st==dr)
    {
        arbint[idx]=nr;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        update(poz,nr,st,mij,2*idx);
    else
        update(poz,nr,mij+1,dr,2*idx+1);
    arbint[idx]=max(arbint[2*idx],arbint[2*idx+1]);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&m,&n);
    for(int i=1; i<=m; i++)
    {
        scanf("%d",&vCit[i]);
    }
    build(1,m,1);
    //printarb();
    for(int i=1; i<=n; i++)
    {
        scanf("%d%d%d",&tip,&aux1,&aux2);
        if(tip)
        {
            update(aux1,aux2,1,m,1);
            //printarb();
        }
        else
        {
            sol=0;
            query(1,m,aux1,aux2,1);
            printf("%d\n",sol);
        }
    }
    return 0;
}