Cod sursa(job #2239495)

Utilizator alisavaAlin Sava alisava Data 10 septembrie 2018 22:11:20
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>
#define LeftSon(x) (x*2)
#define RightSon(x) (x*2+1)
#define mid(x,y) ((x+y)/2)

using namespace std;

ifstream fin("aint.in");
ofstream fout("aint.out");
int aint[200005],v[100005];
int n,m;
int ans;

void Build(int left,int right,int node)
{
    if(left==right)
    {
        aint[node]=v[left];
        return;
    }
    Build(left,mid(left,right),LeftSon(node));
    Build(mid(left,right)+1,right,RightSon(node));
    aint[node]=max(aint[RightSon(node)],aint[LeftSon(node)]);
}
void Update(int left,int right,int node,int &poz,int &val)
{
    if(left==right)
    {
        aint[node]=val;
        v[poz]=val;
        return;
    }
    if(poz<=mid(left,right))
        Update(left,mid(left,right),LeftSon(node),poz,val);
    else
        Update(mid(left,right)+1,right,RightSon(node),poz,val);
    aint[node]=max(aint[RightSon(node)],aint[LeftSon(node)]);
}

void Query(int left,int right,int node,int &Left,int &Right)
{
    if(left>=Left&&right<=Right)
    {
        ans=max(ans,aint[node]);
        return;
    }
    if(Left<=mid(left,right))
        Query(left,mid(left,right),LeftSon(node),Left,Right);
    else
        Query(mid(left,right)+1,right,RightSon(node),Left,Right);
}
int main()
{
    int obt,a,b;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    Build(1,n,1);

    for(int i=1;i<=m;i++)
    {
        fin>>obt>>a>>b;
        switch(obt)
        {
            case 0:
                ans=-2e9;
                Query(1,n,1,a,b);
                fout<<ans<<"\n";
                break;
            case 1:
                Update(1,n,1,a,b);
                break;
        }
    }

    return 0;
}