Cod sursa(job #2172877)

Utilizator FredyLup Lucia Fredy Data 15 martie 2018 18:36:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define lim 100010
int n,m,aint[4*lim],ini[lim];

void build (int nod, int st, int dr)
{
    if (st==dr)
    {
        aint[nod] = ini[st];
        return;
    }
    int mid=(st+dr)/2;
    build (2*nod, st, mid);
    build (2*nod+1, mid+1, dr);
    aint[nod] = max (aint[2*nod], aint[2*nod+1]);
}

void update (int nod, int st, int dr, int poz, int val)
{
    if (st==dr)
    {
        aint[nod] = val;
        return;
    }
    int mid = (st+dr)/2;
    if (mid >= poz)  update (2*nod, st, mid, poz, val);
    else update (2*nod+1, mid+1, dr, poz, val);
    aint[nod] = max (aint[2*nod], aint[2*nod+1]);
}

int query (int nod, int st, int dr, int left, int right)
{
    if (st>=left && dr<=right)  return aint[nod];
    int mid = (st+dr)/2;
    if (right <= mid)  return query (2*nod, st, mid, left, right);
    else if (left > mid) return query (2*nod+1, mid+1, dr, left, right);
    else return max (query (2*nod, st, mid, left, right), query (2*nod+1, mid+1, dr, left, right));
}


int main()
{
    int tip,a,b;
    fin>>n>>m;
    for (int i=1; i<=n; i++)    fin>>ini[i];
    build (1,1,n);

    for (int i=1; i<=m; i++)
    {
        fin>>tip>>a>>b;
        if (tip==0) fout << query (1,1,n,a,b)<<'\n';
        else if (tip==1)  update (1,1,n,a,b);
    }

    return 0;
}