Cod sursa(job #2457575)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 18 septembrie 2019 09:33:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

#define nmax 100005

int Arb[nmax*4],n,m,val,poz,x,task,a,b,st,fn,maxim;

void Update(int nod, int left, int right)
{
    if(left==right)
    {
        Arb[nod]=val;
        return;
    }
    int div=(left+right)/2;
    if(poz<=div)
        Update(2*nod,left,div);
    else
        Update(2*nod+1,div+1,right);
    Arb[nod]=max(Arb[2*nod],Arb[2*nod+1]);
}

void Query(int nod, int left, int right)
{
    if(st<=left && right<=fn)
    {
        if(Arb[nod]>maxim)
            maxim=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);
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        poz=i;
        val=x;
        Update(1,1,n);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>task>>a>>b;
        switch(task)
        {
        case 0:
            {
                maxim=-1;
                st=a;
                fn=b;
                Query(1,1,n);
                fout<<maxim<<'\n';
                break;
            }
        case 1:
            {
                poz=a;
                val=b;
                Update(1,1,n);
                break;
            }
        }
    }
}