Cod sursa(job #2075643)

Utilizator frumcrsFrum Cristian-Mihai frumcrs Data 25 noiembrie 2017 16:23:42
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n,pas;
int v[100000];
int formare(int x,int pas_parcurgere)
{
    if(pas_parcurgere<pas)
    {
        if(pas_parcurgere==(pas-1))
        {
            v[x]=max(v[2*x],v[2*x+1]);
            return v[x];
        }
        else
        {
            v[x]=max(formare(2*x,pas_parcurgere+1),formare(2*x+1,pas_parcurgere+1));
            return v[x];
        }
    }
}

int rangeMaxQuery(int qlow, int qhigh, int low, int high, int pos)
{
    if(qlow<=low && qhigh>=high)
    {
        return v[pos];
    }
    if(high<qlow || low>qhigh)
    {
        return -1;
    }
    int mid=(high+low)/2;
    return max(rangeMaxQuery(qlow,qhigh,low,mid,pos*2),rangeMaxQuery(qlow,qhigh,mid+1,high,pos*2+1));
}
void schimbare(int pozitie)
{
    if(pozitie)
    {
    v[pozitie]=max(v[pozitie*2],v[pozitie*2+1]);
    schimbare(pozitie/2);
    }
}
int main()
{

    int nr_max_frunze,i,m,x,y,z;
    fin>>n>>m;

    nr_max_frunze=1;
    while(nr_max_frunze<n)
    {
        nr_max_frunze*=2;
        pas++;
    }

    for(i=nr_max_frunze;i<=nr_max_frunze+n-1;i++)
    {
        fin>>v[i];
    }
    formare(1,0);
    for(i=1;i<=m;i++)
    {
        fin>>z>>x>>y;
        if(z==0)
        fout<<rangeMaxQuery(x,y,1,nr_max_frunze,1)<<'\n';
        else
        {
            v[nr_max_frunze+x-1]=y;
            schimbare((nr_max_frunze+x-1)/2);
        }
    }

}