Cod sursa(job #2024571)

Utilizator horiacoolNedelcu Horia Alexandru horiacool Data 20 septembrie 2017 20:55:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int N,M,v[100003],AI[400003];

void Create_Segment_tree(int a,int b,int n)
{
    if( a == b )
       AI[n] = v[a];
    else
    {
       int mij = (a+b)/2;
       Create_Segment_tree(a,mij,n*2);
       Create_Segment_tree(mij+1,b,n*2+1);
       AI[n] = max(AI[n*2],AI[n*2+1]);
    }
}

void Update(int a, int b,int n,int poz,int val)
{
    if( a == b )
        AI[n] = val;
    else
    {
        int mij = (a+b)/2;
        if( poz <= mij )
            Update(a,mij,n*2,poz,val);
        else
            Update(mij+1,b,n*2+1,poz,val);
        AI[n] = max(AI[n*2],AI[n*2+1]);
    }
}

int Query(int a,int b,int n,int l,int r)
{
    if( a == l && b == r )
        return AI[n];
    else
    {
        int mij = (a+b)/2;
        if( r <= mij )
            return Query(a,mij,n*2,l,r);
        else
            if( l > mij )
                return Query(mij+1,b,n*2+1,l,r);
            else
                return max(Query(a,mij,n*2,l,mij),Query(mij+1,b,n*2+1,mij+1,r));
    }
}

int main()
{
    int q,a,b;
    f>>N>>M;
    for(int i = 1 ; i <= N ; i++)
        f>>v[i];
    Create_Segment_tree(1,N,1);
    for(int i = 1 ; i <= M ; i++)
    {
        f>>q>>a>>b;
        if( q == 0 )
            g<<Query(1,N,1,a,b)<<'\n';
        else
              Update(1,N,1,a,b);
    }
    return 0;
}