Cod sursa(job #1034562)

Utilizator george_stelianChichirim George george_stelian Data 17 noiembrie 2013 21:54:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#define maxx(a,b) a>b?a:b

using namespace std;

int v[300010],left,right,a,n,i,x,pos,maxim,m;

void schimba(int nod,int st,int dr)
{
    if(st==dr)
    {
        v[nod]=x;
        return;
    }
    int mid=(st+dr)/2;
    if(pos<=mid) schimba(nod*2,st,mid);
    else schimba(nod*2+1,mid+1,dr);
    v[nod]=maxx(v[nod*2],v[nod*2+1]);
}

void raspunde(int nod,int st,int dr)
{
    if(left<=st && dr<=right)
    {
        if(maxim<v[nod]) maxim=v[nod];
        return;
    }
    int mid=(st+dr)/2;
    if(left<=mid) raspunde(nod*2,st,mid);
    if(right>mid) raspunde(nod*2+1,mid+1,dr);
}

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",&x);
        pos=i;
        schimba(1,1,n);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&left,&right);
        if(a==0)
        {
            maxim=-1;
            raspunde(1,1,n);
            printf("%d\n",maxim);
        }
        else
        {
            pos=left;x=right;
            schimba(1,1,n);
        }
    }
    fclose(stdin);fclose(stdout);
    return 0;
}