Cod sursa(job #1510814)

Utilizator GuzgleteBumbu Alexandru Guzglete Data 25 octombrie 2015 17:08:44
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <limits.h>

using namespace std;

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

int v[100010],n,m;
int a,b,op;
int arb[400010];


void build_arb_i(int i,int li,int lf)
{
    if(li==lf)
    {
        arb[i]=v[li];
        return;
    }
    int m=(li+lf)/2;
    build_arb_i(2*i,li,m);
    build_arb_i(2*i+1,m+1,lf);
    arb[i]=max(arb[2*i],arb[2*i+1]);
}

int maxim(int a,int b,int i,int li,int lf)
{
    if(a<=li&&lf<=b)return arb[i];
    int m=(li+lf)/2,v,mx=INT_MIN;
    if(a<=m)
    {
        v=maxim(a,b,2*i,li,m);
        if(v>mx)mx=v;
    }
    if(b>=m+1)
    {
        v=maxim(a,b,2*i+1,m+1,lf);
        if(v>mx)mx=v;
    }
    return mx;
}

int main()
{
    fin>>n>>m;
    for (int i=1;i<=n;i++)
        fin>>v[i];
    for(int i=1;i<=4*n;i++)
        arb[i]=-1;
    build_arb_i (1,1,n);

    for (int i=1;i<=m;i++)
    {
        fin>>op>>a>>b;
        if (op==0)
            fout<<maxim (a,b,1,1,n)<<"\n";
        else
        {
            v[a]=b;
            build_arb_i(1,1,n);
        }
    }
    return 0;
}