Cod sursa(job #2000201)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 12 iulie 2017 21:59:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>

using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n,q,i,sol,op,x,y,v[200011],a[200011];
void build (int nod,int st,int dr){
    if (st == dr)
        a[nod] = v[st];
    else{
        int mid = (st+dr)/2;
        build (2*nod,st,mid);
        build (2*nod+1,mid+1,dr);
        a[nod] = max ( a[2*nod] , a[2*nod+1] );
    }
}

void update (int nod,int st,int dr,int p,int val){

    if (st == dr)
        a[nod] = val;
    else{
        int mid = (st+dr)/2;
        if (p <= mid)
            update (2*nod,st,mid,p,val);
        if (p > mid)
            update (2*nod+1,mid+1,dr,p,val);
        a[nod] = max (a[2*nod] , a[2*nod+1]);
    }

}

void query (int nod,int st,int dr,int x,int y){
    if (x <= st && y >= dr)
        sol = max (sol,a[nod]);
    else{
        int mid = (st+dr)/2;
        if (x <= mid)
            query (2*nod,st,mid,x,y);
        if (mid+1 <= y)
            query (2*nod+1,mid+1,dr,x,y);
    }

}

int main (){

    fin>>n>>q;
    for (i=1;i<=n;i++)
        fin>>v[i];
    build (1,1,n);
    for (;q--;){
        fin>>op>>x>>y;
        if (op == 0){ //query
            sol = 0;
            query (1,1,n,x,y);
            fout<<sol<<"\n";
        }
        else
            update (1,1,n,x,y);

    }


    return 0;
}