Cod sursa(job #1087396)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 19 ianuarie 2014 13:05:50
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int v[100009];
char c[1000000];
class Node
{
    public:
    int val,l,r;
    Node *lt,*rt;
    Node(int lef,int rai)
    {
        l=lef;r=rai;
        if(lef==rai)
        {
            val=v[lef];
            return;
        }
        lt=new Node(lef,(lef+rai)/2);
        rt=new Node((lef+rai)/2+1,rai);
        val=max(lt->val,rt->val);
    }
    void update(int poz,int v)
    {
        if(l==r)
        {
            val=v;
            return;
        }
        if(poz<=(l+r)/2)
            lt->update(poz,v);
        else
            rt->update(poz,v);
        val=max(lt->val,rt->val);
    }
    int query(int lef,int rai)
    {
        if(lef>r||rai<l)
            return -1;
        if(l>=lef&&r<=rai)
            return val;
        return max(lt->query(lef,rai),rt->query(lef,rai));
    }

};

int main()
{
    int n,m,i,op,a,b,nr=1;
    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]);
    Node A(1,n);
    for(i=1;i<=m;i++)
    {
        scanf("%d",&op);
        if(op==0)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",A.query(a,b));
        }
        if(op==1)
        {
            scanf("%d%d",&a,&b);
            A.update(a,b);
        }
    }
    return 0;
}