Cod sursa(job #2289150)

Utilizator 3DwArDPauliuc Edward 3DwArD Data 24 noiembrie 2018 11:41:24
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int A[4*NMAX],n,m,V[NMAX];
int poz;
int start,stop;
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 qry(int l,int r, int node){
    if(l>=start&&r<=stop)
        return A[node];

    int mid=(l+r)/2;
    int max1=INT_MIN,max2=INT_MIN;
    if(start<=mid)max1=qry(l,mid,2*node);
    if(mid+1<=stop)max2=qry(mid+1,r,2*node+1);
    return max(max1,max2);
}
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 citire(){
    f>>n>>m;
    for(int i=1,x;i<=n;i++)f>>V[i];
    build(1,n,1);
}
int main()
{
    citire();

    for(int i=1,type,x,y;i<=m;i++){
        f>>type>>x>>y;
        if(!type){
            start=x;stop=y;
            g<<qry(1,n,1)<<"\n";
        }else{
            poz = x;
            V[x]=y;
            update(1,n,1);
        }
    }


    return 0;
}