Cod sursa(job #1096133)

Utilizator octavdOctavian Dumitrascu octavd Data 1 februarie 2014 16:29:54
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#define dim 1<<18
using namespace std;
int A[dim],ARB[4*dim],N,M,i,j,x,y,max1,tip;

int max(int x,int y)
{
    if (x>=y) return x;
    else return y;
}

void Update(int nod, int st, int dr,int poz,int val)
{
    if (st==dr)
        {
            ARB[nod]=val;
        }
    else
    {
        int m=(st+dr)/2;
        if (poz<=m) Update(nod*2,st,m,poz,val);
        else  Update(nod*2+1,m+1,dr,poz,val);
        ARB[nod]=max(ARB[nod*2],ARB[nod*2+1]);
    }
}


void query(int nod, int st, int dr, int a, int b)
{
    if (a<=st&&dr<=b)
        {
            if (ARB[nod]>max1) max1=ARB[nod];
        }
    else
    {
        int m=(st+dr)/2;
        if (a<=m) query(nod*2,st,m,a,b);
        if (m+1<=b) query (nod*2+1,m+1,dr,a,b);
    }
}


int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d\n",&N,&M);
    for (i=1;i<=N;i++)
        {
            scanf("%d",&x);
            Update(1,1,N,i,x);
        }
    while (M>0)
        {
            M--;
            scanf("%d%d%d",&tip,&x,&y);
            if (tip==1)
            {
                Update(1,1,N,x,y);
            }
            else
            {
                max1=0;
                query(1,1,N,x,y);
                printf("%d\n",max1);
            }
        }
    return 0;
}