Cod sursa(job #1348282)

Utilizator Eduard6421Eduard Gabriel Eduard6421 Data 19 februarie 2015 16:57:27
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#define NMAX 100000
#define max(a,b) a > b ? a : b
using namespace std;

int aint[NMAX*2+1];
int v[NMAX];
int n,ans;



void update(int nod,int st,int dr,int poz,int val) {
    int med;


    if(st==dr) {
        aint[nod]=val;
        return;
    }

    med=(st+dr)/2;


    if(poz<=med)
        update(2*nod,st,med,poz,val);

    else
        update(2*nod+1,med+1,dr,poz,val);

    aint[nod]=max(aint[2*nod],aint[2*nod+1]);


}


void query(int nod,int st,int dr,int x,int y) {

    int med;

    if(x<=st&&y>=dr) {
        ans=max(ans,aint[nod]);
        return;

    }

    med=(st+dr)/2;



    if(x<=med)
        query(2*nod,st,med,x,y);

    if(y>med)
        query(2*nod+1,med+1,dr,x,y);



}



int main() {

    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);


    int m;
    int i;
    int val,type,x,y;


    scanf("%d %d",&n,&m);

    for(i=1; i<=n; ++i) {
        scanf("%d",&val);
        update(1,1,n,i,val);

    }

    for(i=1; i<=m; ++i) {
        scanf("%d",&type);
        if(type) {


            scanf("%d %d",&x,&y);
            update(1,1,n,x,y);


        }

        else {
            ans=0;
            scanf("%d%d",&x,&y);
            query(1,1,n,x,y);
            printf("%d\n",ans);
        }


    }


}