Cod sursa(job #2137518)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 20 februarie 2018 20:46:06
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int N,M,MAXARB[200005],maxim,A,B,X,start,finish,Val,Pos;
int Maxim(int a,int b)
{
    if(a>b) return a;
    else return b;
}
void Update(int nod,int left,int right)
{
    if(left==right)
    {
        MAXARB[nod]=Val;
        return;
    }
    int div=(left+right)/2;
    if(Pos<=div) Update(2*nod,left,div);
    else Update(2*nod+1,div+1,right);
    MAXARB[nod]=Maxim(MAXARB[2*nod],MAXARB[2*nod+1]);
}
void Query(int nod,int left,int right)
{
    if(start<=left && right<=finish)
    {
        maxim=Maxim(MAXARB[nod],maxim);
        return;
    }
    int div=(left+right)/2;
    if(start<=div) Query(2*nod,left,div);
    if(div<finish) Query(2*nod+1,div+1,right);
}
int main()
{
    cin>>N>>M;
    for(int i=1;i<=N;i++)
    {
        cin>>X;
        Pos=i; Val=X;
        Update(1,1,N);
    }
    for(int i=1;i<=M;i++)
    {
        cin>>X>>A>>B;
        if(X==0)
        {
            maxim=-1;
            start=A; finish=B;
            Query(1,1,N);
            cout<<maxim<<'\n';
        }
        else
        {
            Pos=A; Val=B;
            Update(1,1,N);
        }
    }
    cin.close(); cout.close();
}