Cod sursa(job #2253345)

Utilizator alisavaAlin Sava alisava Data 3 octombrie 2018 21:43:09
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
#define RSon(x) (x*2+1)
#define LSon(x) (x*2)

using namespace std;

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

int aint[200005],v[100005], n, m, maxim;

void Build(int node,int left,int right)
{
    if(left==right)
    {
        aint[node]=v[left];
        return;
    }
    int m=(left+right)/2;
    Build(LSon(node),left,m);
    Build(RSon(node),m+1,right);
    aint[node]=max(aint[LSon(node)],aint[RSon(node)]);
}
void Update(int node,int left,int right,const int &poz,const int &val)
{
    if(left==right)
    {
        aint[node]=val;
        v[poz]=val;
        return;
    }
    int m=(left+right)/2;
    if(poz<=m)
        Update(LSon(node),left,m,poz,val);
    else Update(RSon(node),m+1,right,poz,val);
    aint[node]=max(aint[LSon(node)],aint[RSon(node)]);
}
void Query(int node, int left, int right,const int &LeftQ,const int &RightQ)
{
    if(LeftQ<=left && right<=RightQ)
    {
        maxim=max(maxim,aint[node]);
        return;
    }
    int m=(left+right)/2;
    if(LeftQ <= m)
        Query(LSon(node), left, m, LeftQ, RightQ);
    if(m+1 <= RightQ)
        Query(RSon(node), m+1, right, LeftQ, RightQ);

}



int main()
{
    int obt,a,b;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    Build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        fin>>obt>>a>>b;
        if(obt==0)
        {
            maxim=-1e9;
            Query(1,1,n,a,b);
            fout<<maxim<<"\n";
        }
        else
            Update(1,1,n,a,b);
    }

    return 0;
}