Cod sursa(job #2129528)

Utilizator DanizisSpartanulDani Mocanu DanizisSpartanul Data 12 februarie 2018 21:25:57
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

constexpr int NMax=100005;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int N,M;
int Arb[4*NMax+100];
int start,finish,value,position,maximum;

void Update(int node, int left, int right)
{
    if(left==right)
    {
        Arb[node]=value;
        return;
    }
    int middle=(left+right)/2;
    if(position<=middle)
        Update(2*node,left,middle);
    else
        Update(2*node+1,middle+1,right);
    Arb[node]=max(Arb[2*node],Arb[2*node+1]);
}

void Query(int node,int left,int right)
{
    if(start<=left && right<=finish)
    {
        if(maximum<Arb[node])
            maximum=Arb[node];
        return;
    }
    int middle=(left+right)/2;
    if(start<=middle)
        Query(2*node,left,middle);
    if(middle<finish)
        Query(2*node+1,middle+1,right);
}

int main()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++)
    {
        int x;
        fin>>x;
        position=i; value=x;
        Update(1,1,N);
    }

    for(int i=1;i<=M;i++)
    {
        int op,a,b;
        fin>>op>>a>>b;
        if(op==0)
        {
            maximum=-1;
            start=a; finish=b;
            Query(1,1,N);
            fout<<maximum<<"\n";
        }
        if(op==1)
        {
            position=a; value=b;
            Update(1,1,N);
        }
    }

    return 0;
}