Cod sursa(job #1183213)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 8 mai 2014 17:27:55
Problema Arbori de intervale Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
#include <algorithm>
#define N 100010
using namespace std;
int A[N],n,i,key,a,b,m;
struct Nod
{
    Nod *left,*right,*dad;
    int val;
};
Nod *root,*nl,*nr;
void Build(int low,int high,Nod *nod)
{
    int midle=(high+low)>>1;
    if(low==high)
    {
        nod->val=A[low];
        return;
    }
    else
    {
         nl=new Nod;
        nr=new Nod;
        nod->left=nl;
        nod->right=nr;
        Build(low,midle,nod->left);
        Build(midle+1,high,nod->right);
        nod->val=(nod->left)->val>(nod->right)->val?(nod->left)->val:(nod->right)->val;
    }
}
int Query(int low,int high,Nod *nod)
{
    int midle=(high+low)>>1;
    if(high<a||low>b)
        return 0;
    if(low>=a&&high<=b)
        return nod->val;
    return max(Query(low,midle,nod->left),Query(midle+1,high,nod->right));
}
int Update(int low,int high,Nod *nod)
{
    int midle=(high+low)>>1;
    if(low==high&&low==a)
        nod->val=b;
    if(low==high)
        return nod->val;
    nod->val=max(Update(low,midle,nod->left),Update(midle+1,high,nod->right));
    return nod->val;

}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&A[i]);
    root=new Nod;
    Build(1,n,root);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&key,&a,&b);
        if(key)
        {
            A[a]=b;
            Update(1,n,root);
        }
        else
            printf("%d\n",Query(1,n,root));
    }
    return 0;
}