Cod sursa(job #1621767)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 29 februarie 2016 21:33:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <cstdio>

using namespace std;

int arbore[300000];
int N,M;

void update(int nod_curent,int nod,int val,int st,int dr)
{
    if(st==dr)
    {
        arbore[nod_curent]=val;
        return;
    }
    int mid = (st+dr)/2;
    if(nod<=mid)
    {
        update(nod_curent*2,nod,val,st,mid);
    }
    if(nod>mid)
    {
        update(nod_curent*2+1,nod,val,mid+1,dr);
    }

    arbore[nod_curent] = max(arbore[nod_curent*2],arbore[nod_curent*2+1]);
}

void query(int a,int b,int nod_curent,int st,int dr,int &maxim)
{
    if(a<=st&&dr<=b)
    {
        if(arbore[nod_curent]>maxim)
            maxim = arbore[nod_curent];
        return;
    }
    int mid = (st+dr)/2;
    if(a<=mid)
    {
        query(a,b,nod_curent*2,st,mid,maxim);
    }
    if(b>mid)
    {
        query(a,b,nod_curent*2+1,mid+1,dr,maxim);
    }

}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;i++)
    {
        int x;
        scanf("%d",&x);
        update(1,i,x,1,N);
    }
    for(int i=1;i<=M;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        if(x == 0)
        {
            int maxim = 0;
            query(y,z,1,1,N,maxim);
            printf("%d\n",maxim);
        }
        else
        {
            update(1,y,z,1,N);
        }
    }
    return 0;
}