Cod sursa(job #2289168)

Utilizator gab999Ungureanu Gabriel gab999 Data 24 noiembrie 2018 11:45:07
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

#define Nmax 100005



using namespace std;



ifstream f("arbint.in");

ofstream g("arbint.out");



int v[Nmax],A[4*Nmax],n,m;

int poz,start,stop;



void build(int l,int r, int node){

    if(l==r){

        A[node]=v[l];

    }

    else{

        int mid=(l+r)/2;

        build(l,mid,2*node);

        build(mid+1, r, 2*node+1);



        A[node]=max(A[2*node], A[2*node+1]);



    }

}



void update(int l, int r, int node){

    if(l==r){

            A[node]=v[l];

    }else{

    int mid=(l+r)/2;

    if(poz<=mid) update(l,mid,2*node);

    else update(mid+1, r, 2*node+1);



      A[node]=max(A[2*node], A[2*node+1]);

    }

}



int query(int l, int r, int node){

    if(start<=l && stop>=r)

    {

        return A[node];

    }else{

    int mid=(l+r)/2;

    int maxl=INT_MIN,maxr=INT_MIN;



    if(start<=mid)

        maxl=query(l,mid,2*node);

    if(mid+1<=stop) maxr=query(mid+1, r, 2*node+1);



    return max(maxl, maxr);

    }

}



int main(){

    f>>n>>m;

    for(int i=1; i<=n; i++)

        f>>v[i];



    build(1,n,1);



    int op, x,y;

    for(int i=1; i<=m; i++){

        f>>op>>x>>y;

        if(op==0)

        {

            start=x;

            stop=y;



            g<<query(1,n,1)<<"\n";

        }

        else{

            v[x]=y;

            poz=x;

            update(1,n,1);

        }

    }



return 0;

}