Cod sursa(job #2145319)

Utilizator DanizisSpartanulDani Mocanu DanizisSpartanul Data 27 februarie 2018 11:49:08
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMax=100005;
const int INF=1<<30;

class SegmentTree
{
    public:SegmentTree(int size)
    {
        N=size;
        int lg=ceil(log2(N));
        ST.resize(1<<lg+1);
    }
    public:void Update(int index,int value)
    {
        Update(index,value,1,1,N);
    }
    public:int Query(int start,int finish)
    {
        return Query(start,finish,1,N,1);
    }


    private:int N;
    private:vector<int> ST;

    private:void Update(int index,int value,int node,int left,int right)
    {
        if(left==right)
        {
            ST[node]=value;
            return;
        }
        int middle=(left+right)/2;
        if(index<=middle)
            Update(index,value,2*node,left,middle);
        else
            Update(index,value,2*node+1,middle+1,right);
        ST[node]=max(ST[2*node],ST[2*node+1]);
    }

    private:int Query(int start,int finish,int left, int right, int node=1)
    {
        if(start<=left && finish>=right)
            return ST[node];
        int middle=(left+right)/2;
        int ret=-INF;
        if(start<=middle)
            ret=max(ret,Query(start,finish,left,middle,2*node));
        if(finish>middle)
            ret=max(ret,Query(start,finish,middle+1,right,2*node+1));
        return ret;
    }
};

int N,M;

int main()
{
    fin>>N>>M;

    SegmentTree segmentTree(N);
    for(int i=1;i<=N;i++)
    {
        int x;
        fin>>x;
        segmentTree.Update(i,x);
    }

    for(int i=1;i<=M;i++)
    {
        int op,a,b;
        fin>>op>>a>>b;
        if(op==0)
            fout<<segmentTree.Query(a,b)<<"\n";
        if(op==1)
            segmentTree.Update(a,b);
    }

    return 0;
}