Cod sursa(job #1802139)

Utilizator UTCN_FrunzaUTCN Lazar Nitu Petruta UTCN_Frunza Data 9 noiembrie 2016 21:40:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

int arb[300000];
int v[100005];

void construct(int st, int dr, int nod)
{
    if(st==dr)
    {
        arb[nod]=v[st];
        return;
    }
    int mid=(st+dr)/2;
    construct(st,mid,nod*2);
    construct(mid+1,dr,nod*2+1);
    arb[nod]=max(arb[nod*2], arb[nod*2+1]);
}

void update(int st, int dr, int nod, int poz, int val)
{
    if(st==dr)
    {
        arb[nod]=val;
        return;
    }
    int mid=(st+dr)/2;
    if(poz<=mid)
    {
        update(st,mid,nod*2,poz,val);
    }
    else
    {
        update(mid+1,dr,nod*2+1,poz,val);
    }
    arb[nod]=max(arb[nod*2], arb[nod*2+1]);
}

int maxInterval(int st, int dr,int sourceSt, int sourceDr, int nod)
{
    if(sourceSt<=st && dr<=sourceDr)
    {
        return arb[nod];
    }
    int maxValue = 0;
    int mid=(st+dr)/2;
    if(sourceSt<=mid)
    {
        maxValue =  maxInterval(st, mid,sourceSt, sourceDr, nod*2);
    }
    if(mid<sourceDr)
    {
        maxValue = max(maxValue,maxInterval(mid+1, dr,sourceSt, sourceDr, nod*2+1));
    }
    return maxValue;
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&v[i]);
    }
    construct(1,n,1);
    for(int i=0; i<m; i++)
    {
        int o,a,b;
        scanf("%d %d %d",&o,&a, &b);
        if(o==0)
        {
            printf("%d\n",maxInterval(1,n,a,b,1));
            continue;
        }
        if(o==1)
        {
            update(1,n,1,a,b);
            continue;
        }
    }
}