Cod sursa(job #1204459)

Utilizator DenisacheDenis Ehorovici Denisache Data 2 iulie 2014 23:25:44
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX_N 100005
int N,M,arbInt[MAX_N<<2],val,i,maxim;
void Update(int nod,int left,int right,int poz,int val)
{
    if (left==right)
    {
        arbInt[nod]=val;
        return;
    }
    int mid=(left+right)>>1;
    if (poz<=mid) Update(nod<<1,left,mid,poz,val);
    else Update((nod<<1)+1,mid+1,right,poz,val);
    arbInt[nod]=max(arbInt[nod<<1],arbInt[(nod<<1)+1]);
}
void Query(int nod,int left,int right,int start,int finish)
{
    if (start<=left && right<=finish)
    {
        if (arbInt[nod]>maxim) maxim=arbInt[nod];
        return;
    }
    int mid=(left+right)>>1;
    if (start<=mid) Query(nod<<1,left,mid,start,finish);
    else if (mid<finish) Query((nod<<1)+1,mid+1,right,start,finish);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&N,&M);
    for (i=1;i<=N;i++) scanf("%d",&val),Update(1,1,N,i,val);
    while (M--)
    {
        int op,x,y;
        scanf("%d %d %d",&op,&x,&y);
        if (op) Update(1,1,N,x,y);
        else maxim=0,Query(1,1,N,x,y),printf("%d\n",maxim);
    }
    return 0;
}