Cod sursa(job #2176836)

Utilizator IsacLucianIsac Lucian IsacLucian Data 18 martie 2018 10:10:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define oo 1000000001

using namespace std;

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

int n,m;
int aint[400005],a[100005];

void Build(int node,int left,int right)
{
    if(left==right)
    {
        aint[node]=a[left];
        return ;
    }

    int mid=(left+right)/2;
    Build(2*node+1,left,mid);
    Build(2*node+2,mid+1,right);

    aint[node]=max(aint[2*node+1],aint[2*node+2]);
}

void Update(int node,int left,int right,int x,int y)
{
    if(left==right)
    {
        aint[node]=y;
        return ;
    }

    int mid=(left+right)/2;
    if(x<=mid)Update(2*node+1,left,mid,x,y);
    else Update(2*node+2,mid+1,right,x,y);

    aint[node]=max(aint[2*node+1],aint[2*node+2]);
}

int Querry(int node,int left,int right,int x,int y)
{
    if(x<=left && right<=y)
        return aint[node];

    int answer=-oo;
    int mid=(left+right)/2;

    if(x<=mid)answer=max(answer,Querry(2*node+1,left,mid,x,y));
    if(y>=mid+1)answer=max(answer,Querry(2*node+2,mid+1,right,x,y));

    return answer;
}

int main()
{
    int i,op,x,y;

    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>a[i];

    Build(0,1,n);

    while(m--)
    {
        fin>>op>>x>>y;

        if(op==0)fout<<Querry(0,1,n,x,y)<<"\n";
        else Update(0,1,n,x,y);
    }
    return 0;
}