Cod sursa(job #2289170)

Utilizator roberthostiucHostiuc Robert Gabriel roberthostiuc Data 24 noiembrie 2018 11:45:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
#define Nmax 1000005

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

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

void citire(){
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
}

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 and 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);
    }
}

void rezolvare(){
    citire();
    build(1,n,1);
    for(int i=1,op,x,y;i<=m;i++){
        fin>>op>>x>>y;
        if(op==0){
            start=x;stop=y;
            fout<<query(1,n,1)<<"\n";
        }
        else {

                v[x]=y;
                poz=x;
                update(1,n,1);
        }
    }
}

int main()
{
    rezolvare();

    return 0;
}