Cod sursa(job #2239701)

Utilizator IustinPetrariuIustinian Petrariu IustinPetrariu Data 11 septembrie 2018 18:08:20
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#define NMAX 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N,M,MaxArb[NMAX],X,poz,Val,query,maxim;
int start,finish,A,B;
inline int Maxim(int a, int b)
{
    if(a > b) return a;
    return b;
}
void Update(int node, int left, int right)
{
    if(left==right)
    {
        MaxArb[node]=Val;
        return;
    }
    int div=(left+right)/2;
    if( poz <= div) Update(node*2,left,div);
    else Update(node*2+1,div+1,right);
    MaxArb[node]=Maxim(MaxArb[node*2],MaxArb[node*2+1]);
}
void Query(int node, int left, int right)
{
    if(start <= left && right <= finish)
    {
        if(maxim < MaxArb[node]) maxim=MaxArb[node];
        return;
    }
    int div=(left+right)/2;
    if(start <= div) Query(2*node,left,div);
    if(div < finish) Query(2*node+1,div+1,right);
}
int main()
{

    fin>>N>>M;
    for(int i = 1; i <= N; i++)
    {
        fin>>X;
        poz=i;
        Val=X;
        Update(1,1,N);
    }
    for(int i = 1; i <= M; i++)
    {
        fin>>query>>A>>B;
        if(query==0)
        {
            maxim=-1;
            start=A;
            finish=B;
            Query(1,1,N);
            fout<<maxim<<'\n';
        }
        else
        {
            poz=A;
            Val=B;
            Update(1,1,N);
        }
    }
}