Cod sursa(job #2186462)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 25 martie 2018 17:17:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <cstdio>
using namespace std;
int arb[400005],vCit[100005],n,m,rasp;
void buildarb(int pai=1,int st=1,int dr=n)
{
    if(st==dr)
    {
        arb[pai]=vCit[st];
        return;
    }
    int mij=(st+dr)/2;
    buildarb(2*pai,st,mij);
    buildarb(2*pai+1,mij+1,dr);
    arb[pai]=max(arb[2*pai],arb[2*pai+1]);
}
void query(int ST,int DR,int pai=1,int st=1,int dr=n)
{
    if(ST<=st&&dr<=DR)
        {
            rasp=max(rasp,arb[pai]);
            return;
        }
    int mij=(st+dr)/2;
    if(mij>=ST)
        query(ST,DR,2*pai,st,mij);
    if(mij<DR)
        query(ST,DR,2*pai+1,mij+1,dr);
}
void update(int poz,int val,int pai=1,int st=1,int dr=n)
{
    if(st==dr)
    {
        arb[pai]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(mij>=poz)
        update(poz,val,2*pai,st,mij);
    else
        update(poz,val,2*pai+1,mij+1,dr);
    arb[pai]=max(arb[2*pai],arb[2*pai+1]);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        scanf("%d",&vCit[i]);
    buildarb();
    int t,a,b;
    while(m--)
    {
        scanf("%d%d%d",&t,&a,&b);
        if(!t)
        {
            rasp=-1;
            query(a,b);
            printf("%d\n",rasp);
        }
        else
            update(a,b);
    }
    return 0;
}