Cod sursa(job #1827279)

Utilizator edicCiuculescu Eduard edic Data 11 decembrie 2016 18:16:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<cstdio>
using namespace std;
struct arb{int val,st,dr;};
arb aint[400005];
int gen(int n)
{
    int x=1;
    while(x<n)
    {
        x*=2;
    }
    return x;
}
int mas(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
int build(int i)
{
    if(aint[i].st==0)
    {
        aint[i].val=mas(build(2*i),build(2*i+1));
        aint[i].st=aint[2*i].st;
        aint[i].dr=aint[2*i+1].dr;
    }
    return aint[i].val;
}
void update(int i,int poz,int val)
{
    if(aint[i].st==aint[i].dr)
    {
        aint[i].val=val;
        return ;
    }
    int mid=aint[2*i].dr;
    if(poz<=mid)
    {
        update(2*i,poz,val);
    }
    else
    {
        update(2*i+1,poz,val);
    }
    aint[i].val=mas(aint[2*i].val,aint[2*i+1].val);
}
int query(int i,int st,int dr)
{
    if(st<=aint[i].st&&aint[i].dr<=dr)
        return aint[i].val;
    int a=0,b=0,mid=aint[2*i].dr;
    if(dr>=mid+1)
        a=query(2*i+1,st,dr);
    if(st<=mid)
        b=query(2*i,st,dr);
    return mas(a,b);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m,pn,i,c,a,b;
    scanf("%d%d",&n,&m);
    pn=gen(n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&aint[pn-1+i].val);
        aint[pn-1+i].st=i;
        aint[pn-1+i].dr=i;
    }
    for(i=n+1;i<=pn;i++)
    {
        aint[pn-1+i].st=i;
        aint[pn-1+i].dr=i;
    }
    int junk=build(1);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&c,&a,&b);
        if(c==1)
        {
            update(1,a,b);
        }
        else
        {
            printf("%d\n",query(1,a,b));
        }
    }
    return 0;
}