Cod sursa(job #2030255)

Utilizator eragon0502Dumitrescu Dragos eragon0502 Data 1 octombrie 2017 13:03:41
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int v[100005],ai[500005],rez;

/*void upd(int x)
{
    int st=0,dr=n-1,poz=1;
    while(st!=dr)
    {
        mijl=(st+dr)/2;
        while(mijl>=x)
        {
            poz=2*poz;
            dr=mijl;
            mijl=(st+dr)/2;
        }
        while(mijl<x)
        {
            poz=2*poz+1;
            st=mijl+1;
            mijl=(st+dr)/2;
        }
    }
}*/

void init(int poz, int st, int dr)
{
    if(st==dr)
        ai[poz]=v[st];
    else
    {
        init(2*poz+1,(st+dr)/2+1,dr);
        init(2*poz,st,(st+dr)/2);
        ai[poz]=max(ai[poz*2],ai[poz*2+1]);
    }
}

void update(int poz, int st, int dr, int loc, int x)
{
    if(st==dr)
        ai[poz]=x;
    else
    {
        int mijl=(st+dr)/2;
        if(loc<=mijl)
            update(2*poz,st,mijl,loc,x);
        else
            update(2*poz+1,mijl+1,dr,loc,x);
    }
    ai[poz]=max(ai[2*poz],ai[2*poz+1]);
}

void maxint(int poz, int st, int dr, int a, int b)
{
    if(st>=a&&dr<=b)
        rez=max(rez,ai[poz]);
    else
    {
        int mijl=(st+dr)/2;
        if(b>mijl)
            maxint(2*poz+1,mijl+1,dr,a,b);
        if(a<=mijl)
            maxint(2*poz,st,mijl,a,b);
    }
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m,p,a,b;

    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",&p,&a,&b);
        if(p==0)
        {
            rez=0;
            maxint(1,1,n,a,b);
            printf("%d\n",rez);
        }
        else
            update(1,1,n,a,b);
    }

    return 0;
}