Cod sursa(job #1818482)

Utilizator UrsuDanUrsu Dan UrsuDan Data 29 noiembrie 2016 12:17:12
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#include <iostream>
#define inf 1000000050
using namespace std;

int v[100050];
int arbint[100050];
int poz,val,a,b;

int build(int node, int left,int right)
{
    if(left==right)
    {
        arbint[node]=v[left];
        return arbint[node];
    }
    int mid;
    mid=(left+right)/2;
    arbint[node]=max(build(2*node,left,mid),build(2*node+1,mid+1,right));
    return arbint[node];
}

void update(int node,int left,int right)
{
    int mid;
    if(left==right)
    {
        arbint[node]=val;
        return;
    }
    mid=(left+right)/2;
    if(poz<=mid)
        update(2*node,left,mid);
    else
        update(2*node+1,mid+1,right);
    arbint[node]=max(arbint[2*node],arbint[2*node+1]);
}

int query(int node,int left,int right)
{

    if(a<=left && right<=b)
        return arbint[node];
    int mid,ans=-inf;
    mid=(left+right)/2;
    if(a<=mid)
        ans=max(ans,query(2*node,left,mid));
    if(b>=mid+1)
        ans=max(ans,query(2*node+1,mid+1,right));
    return ans;
}

int main()
{
    int m,n,i,p,j;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++)
        scanf("%d",&v[i]);
    build(1,1,n);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d",&p,&a,&b);
        if(p==1)
        {
            poz=a;
            val=b;
            update(1,1,n);
        }
        else
            printf("%d\n",query(1,1,n));
    }
    return 0;
}