Cod sursa(job #900083)

Utilizator SerbanAlexandru9Serban Alexandru SerbanAlexandru9 Data 28 februarie 2013 17:35:13
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <stdio.h>

using namespace std;

#define NMAX 100000
int v[NMAX],x[3*NMAX],n,m,max;

void init(int r,int st,int dr)
{
    int m;
    if(st==dr)
        x[r]=v[st];
    else
    {   m=(st+dr)/2;
        init(r*2,st,m);
        init(r*2+1,m+1,dr);
        if(x[2*r]>x[2*r+1])
            x[r]=x[2*r];
        else
            x[r]=x[2*r+1];
    }
}
int query(int r,int st,int dr,int a,int b)
{
    int m,val;
    if(a<=st&&dr<=b)
        return x[r];
    else
    {   m=(st+dr)/2;
        if(a<=m)
        {
            val=query(2*r,st,m,a,b);
            if(val>max)
                max=val;
        }
        if(b>=m+1)
        {
            val=query(2*r+1,m+1,dr,a,b);
            if(val>max)
                max=val;
        }
        return max;
    }
}

void update(int r,int st,int dr,int a,int b)
{   int m;
    if(st==dr)
        x[r]=b;
    else
    {   m=(st+dr)/2;
        if(a<=m)
        {
            update(2*r,st,m,a,b);
        }
        else
        {
            update(2*r+1,m+1,dr,a,b);
        }
        if(x[2*r]<x[2*r+1])
            x[r]=x[2*r+1];
        else
            x[r]=x[2*r];
    }
}
int main()
{   int t,a,b;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);
    init(1,1,n);
    for(int i=1;i<=m;i++)
    {   scanf("%d%d%d",&t,&a,&b);
        if(t==0)
        {
            max=0;
            printf("%d\n",query(1,1,n,a,b));
        }
        else
        {
            update(1,1,n,a,b);
        }

    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}