Cod sursa(job #2070474)

Utilizator alisavaAlin Sava alisava Data 19 noiembrie 2017 16:43:36
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>

#define mij(st,fn) ((st+fn)/2)

using namespace std;

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

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


int v[100005],arb[400005],k,poz,val,n,m,RQuery,LQuery,ans;

void Formare(int nod,int st,int fn)
{
    if(st==fn) {arb[nod]=v[st];return;}
    Formare(LeftSon(nod),st,mij(st,fn));
    Formare(RightSon(nod),mij(st,fn)+1,fn);
    arb[nod]=max(arb[LeftSon(nod)],arb[RightSon(nod)]);
}



void Update(int nod,int st,int fn)
{
    if(st==fn)
    {
        arb[st]=val;
        return;
    }
    if(poz<=mij(st,fn))
        Update(arb[LeftSon(nod)],st,mij(st,fn));
    else
        Update(arb[RightSon(nod)],mij(st,fn)+1,fn);
    arb[nod]=max(arb[LeftSon(nod)],arb[RightSon(nod)]);
}

void Query(int nod, int left, int right)
{
    if(LQuery<=left&&right<=RQuery)
    {
        ans = max(ans,arb[nod]);
        return;
    }
    if(LQuery<=mij(left,right))
        Query(LeftSon(nod),left,mij(left,right));
    if(RQuery>=mij(left,right)+1)
        Query(RightSon(nod),mij(left,right)+1,right);

}




int main()
{
    int op, x, y;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    Formare(1,1,n);

    for (int i=1;i<=m;i++)
    {
        fin>>op>>x>>y;
       if(op==0)
        {
            ans = -2000000000;
            LQuery=x;
            RQuery=y;
            Query(1, 1, n);
            fout<<ans<<"\n";
        }
        else
        {
            poz=x;
            val=y;
            Update(1, 1, n);
        }
    }
    return 0;
}