Cod sursa(job #2158054)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 10 martie 2018 10:05:59
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 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;
        }
    build(st,(st+dr)/2,2*idx);
    build((st+dr)/2+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(DR>mij)
        query(mij+1,dr,ST,DR,2*idx+1);
    if(ST<=mij)
        query(st,mij,ST,DR,2*idx);
}
void update(int poz,int nr,int st,int dr,int idx)
{
    if(st==dr)
    {
        if(st==poz)
            arbint[idx]=nr;
        return;
    }
    update(poz,nr,st,(st+dr)/2,2*idx);
    update(poz,nr,(st+dr)/2+1,dr,2*idx+1);
    arbint[idx]=max(arbint[2*idx],arbint[2*idx+1]);
}
void printarb()
{
    for(int i=1;i<=4*n;i++)
        printf("%d",arbint[i]);
    printf("\n");
}
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,n,1);
    //printarb();
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&tip,&aux1,&aux2);
        if(tip)
            {
                update(aux1,aux2,1,n,1);
                //printarb();
            }
        else
            {
                sol=0;
                query(1,n,aux1,aux2,1);
                printf("%d\n",sol);
            }
    }
    return 0;
}