Cod sursa(job #1289430)

Utilizator MaarcellKurt Godel Maarcell Data 9 decembrie 2014 21:21:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
using namespace std;

struct a_nod{
    int l,r,val;
    a_nod *left,*right;

    a_nod(){
        left=right=NULL;
    }
};

int a[100100],val,ql,qr,N,M,res; a_nod *root;

void init_tree(a_nod *nod){
    if (nod->l==nod->r){
        nod->val=a[nod->l];
        return;
    }

    int mid=(nod->l+nod->r)/2;
    a_nod *aux = new a_nod;
    aux->l=nod->l, aux->r=mid;
    nod->left=aux;
    init_tree(aux);

    aux=new a_nod;
    aux->l=mid+1, aux->r=nod->r;
    nod->right=aux;
    init_tree(aux);

    nod->val=max(nod->left->val,nod->right->val);
}

void update(a_nod *nod){
    if (nod->l==nod->r){
        nod->val=val;
        return;
    }

    int mid=(nod->l+nod->r)/2;
    if (ql<=mid) update(nod->left);
    else update(nod->right);
    nod->val=max(nod->left->val,nod->right->val);
}

void query(a_nod *nod){
    if (ql<=nod->l && nod->r<=qr){
        res=max(res,nod->val);
        return;
    }

    int mid=(nod->l+nod->r)/2;
    if (ql<=mid) query(nod->left);
    if (qr>mid)  query(nod->right);
}

int main(){
    ifstream in("arbint.in");
    ofstream out("arbint.out");
    in >> N >> M;

    int i,op;
    for (i=1; i<=N; i++)
        in >> a[i];

    root=new a_nod;
    root->l=1,root->r=N;
    init_tree(root);

    while (M--){
        in >> op >> ql >> qr;
        if (op==0){
            res=0;
            query(root);
            out << res << "\n";
        }
        else{
            val=qr;
            update(root);
        }
    }

    return 0;
}