Cod sursa(job #1956271)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 6 aprilie 2017 16:59:00
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int N,M;
int maxim;
class Arbint
{

    public:
    void Update(int nod, int left, int right,int pos,int val)
    {
        if ( left == right )
        {
            MaxArb[nod] = val;
            return;
        }

        int mij = (left+right)/2;
        if ( pos <= mij)  Update(2*nod  ,left ,mij  ,pos,val);
        else              Update(2*nod+1,mij+1,right,pos,val);

        MaxArb[nod] = max( MaxArb[2*nod], MaxArb[2*nod+1] );
    }

    void Query(int nod, int left, int right,int start,int finish)
    {
        if ( start <= left && right <= finish )
        {
            if ( maxim < MaxArb[nod] ) maxim = MaxArb[nod];
            return;
        }

        int mij = (left+right)/2;
        if ( start <= mij ) Query(2*nod  ,left ,mij  ,start,finish);
        if ( mij < finish ) Query(2*nod+1,mij+1,right,start,finish);
    }

    private:
    int MaxArb[500000];

};


int main()
{
    Arbint myArb;
    f>>N>>M;
    for(int i=1;i<=N;i++)
    {
        int x;
        f>>x;
        myArb.Update(1,1,N,i,x);
    }

    for(int i=1;i<=N;i++)
    {
        int t,x,y;
        f>>t>>x>>y;
        if(t==0)
        {
            maxim=-1;
            myArb.Query(1,1,N,x,y);
            cout<<maxim<<'\n';
        }
        else myArb.Update(1,1,N,x,y);
    }

}