Cod sursa(job #2736377)

Utilizator FastmateiMatei Mocanu Fastmatei Data 3 aprilie 2021 13:45:33
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

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

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

int Leftson(int x)
{
    return 2*x;
}

int Rightson(int x)
{
    return 2*x+1;
}

void Build(int nod,int left,int right)
{
    if(left==right)
    {
        aint[nod]=a[left];
        return;
    }
    int mij=(left+right)/2;
    Build(Leftson(nod),left,mij);
    Build(Rightson(nod),mij+1,right);
    aint[nod]=max(aint[Leftson(nod)],aint[Rightson(nod)]);
}

void Update(int nod,int left,int right,int poz,int val)
{
    if(left==right)
    {
        aint[nod]=val;
        a[nod]=val;
        return;
    }
    int mij=(left+right)/2;
    if(poz<=mij) Update(Leftson(nod),left,mij,poz,val);
    else Update(Rightson(nod),mij+1,right,poz,val);
    aint[nod]=max(aint[Leftson(nod)],aint[Rightson(nod)]);
}

void Query(int nod,int left,int right,int lquery,int rquery,int &ans)
{
    if(left>=lquery && rquery>=right)
    {
        ans=max(ans,aint[nod]);
        return;
    }
    int mij=(left+right)/2;
    if(lquery<=mij) Query(Leftson(nod),left,mij,lquery,rquery,ans);
    if(rquery>mij) Query(Rightson(nod),mij+1,right,lquery,rquery,ans);
}

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