Cod sursa(job #993478)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 3 septembrie 2013 21:57:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#define NMax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N,M,AINT[4*NMax],V[NMax],Max;
void Build(int Node, int Left, int Right)
{
    if(Left==Right)
        {
            AINT[Node]=V[Left];
            return;
        }
    int Mid=(Left+Right)/2;
    Build(2*Node,Left,Mid);Build(2*Node+1,Mid+1,Right);
    AINT[Node]=max(AINT[2*Node],AINT[2*Node+1]);
}
void Update(int Node, int Left, int Right,int P, int V)
{
    if(Left==Right)
        {
            AINT[Node]=V;
            return;
        }
    int Mid=(Left+Right)/2;
    if(P<=Mid)
        Update(2*Node,Left,Mid,P,V);
    else
        Update(2*Node+1,Mid+1,Right,P,V);
    AINT[Node]=max(AINT[2*Node],AINT[2*Node+1]);
}
void Query(int Node, int Left, int Right, int Start, int Finish)
{
    if(Start<=Left && Right<=Finish)
    {
        Max=max(Max,AINT[Node]);
        return;
    }
    int Mid=(Left+Right)/2;
    if(Start<=Mid)
        Query(2*Node,Left,Mid,Start,Finish);
    if(Finish>Mid)
        Query(2*Node+1,Mid+1,Right,Start,Finish);
}
int main()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++)
        fin>>V[i];
    Build(1,1,N);
    while(M--)
    {
        int op,a,b;
        fin>>op>>a>>b;
        if(op==0)
            {
                Max=0;
                Query(1,1,N,a,b);
                fout<<Max<<'\n';
            }
        if(op==1)
            {
                Update(1,1,N,a,b);
            }
    }
    return 0;
}