Cod sursa(job #2289182)

Utilizator BiancabatinasBianca batinas Biancabatinas Data 24 noiembrie 2018 11:48:05
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;

ifstream in("arb.in");
ofstream out("arb.out");


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

void build(int l,int r,int node)
{
    if(l==r)
    {
        A[node]=v[l];

    }
    else
    {
        int mij=(l+r)/2;
        build(l,mij,2*node);
        build(mij,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 mij=(l+r)/2;
        if(poz<=mij)
        {
            update(l,mij,2*node);
        }
        else
            update(mij+1,r,2*node+1);

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

int q(int l,int r, int node)
{
    if(start<=l && stop>=r)
    {
        return A[node];
    }
    else{
        int mij=(l+r)/2;
        int maxl=INT_MIN,maxr=INT_MIN;
        if(start<=mij)
        {
            maxl=q(l,mij,2*node);
        }
        if(mij+1<=stop)
        {
            maxr=q(mij+1,r,2*node+1);
        }


        return max(maxr,maxl);
    }
}

int main()
{
   in>>n>>m;
   for(int i=1; i<=n; ++i)
    in>>v[i];

    build(1,n,1);
    int op,x,y;
    for(int i=1; i<=m; ++i)
    {

        in>>op>>x>>y;

        if(op==0)
        {
            start=x;
            stop=y;
            out<<q(1,n,1)<<' ';
        }
        else
        {
            v[x]=y;
            poz=x;
            update(1,n,1);
        }
    }
    return 0;
}