Cod sursa(job #2575137)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 6 martie 2020 11:48:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda imded Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

const int DIM = 100005;

int Arb[DIM*4+2],n,q,event,a,b,x,val,pos,ans,st,fn;

void Update(int node, int st, int dr)
{
    if(st==dr)
    {
        Arb[node]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(pos<=mij)
        Update(2*node,st,mij);
    else
        Update(2*node+1,mij+1,dr);
    Arb[node]=max(Arb[2*node],Arb[2*node+1]);
}

void Query(int nod, int left, int right)
{
    if(st<=left && right<=fn)
    {
        ans=max(ans,Arb[nod]);
        return;
    }
    int div=(left+right)/2;
    if(st<=div)
        Query(2*nod,left,div);
    if(div<fn)
        Query(2*nod+1,div+1,right);
}

void Read()
{
    fin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        val=x;
        pos=i;
        Update(1,1,n);
    }
}

void Query()
{
    for(int i=1;i<=q;i++)
    {
        fin>>event>>a>>b;
        switch(event)
        {
        case 0:
            {
                ans=0;
                st=a;
                fn=b;
                Query(1,1,n);
                fout<<ans<<'\n';
                break;
            }
        default:
            {
                pos=a;
                val=b;
                Update(1,1,n);
                break;
            }
        }
    }
}
int main()
{
    Read();
    Query();
}