Cod sursa(job #2132801)

Utilizator RaduGiucleaGiuclea Radu RaduGiuclea Data 16 februarie 2018 01:17:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int v[100002],arb[300002],mx;
void recalculate(int node)
{
    arb[node]=max(arb[node*2],arb[node*2+1]);
}
void build(int node,int a,int b)
{
    if(a==b)
        arb[node]=v[a];
    else
    {
        build(2*node,a,(a+b)/2);
        build(2*node+1,(a+b)/2+1,b);
        recalculate(node);
    }
}
void query(int a,int b,int node,int st,int dr)
{
    if(a<=st&&dr<=b)
    {
        if(arb[node]>mx)
            mx=arb[node];
    }
    else
    {
        int mid=(st+dr)/2;
        if(mid>=a)
            query(a,b,node*2,st,mid);
        if(mid+1<=b)
            query(a,b,node*2+1,mid+1,dr);
    }
}
void update(int poz,int k,int node,int st,int dr)
{
    int mid=(st+dr)/2;
    if(st!=dr)
    {
        if(poz<=mid)
            update(poz,k,2*node,st,mid);
        else update(poz,k,2*node+1,mid+1,dr);
        recalculate(node);
    }
    else arb[node]=k;
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,i,m,p,a,b,j;
    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)
        {
            mx=-1;
            query(a,b,1,1,n);
            printf("%d\n",mx);
        }
        else update(a,b,1,1,n);
    }
    return 0;
}