Cod sursa(job #2077947)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 28 noiembrie 2017 19:14:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 100005
ifstream f("arbint.in");
ofstream g("arbint.out");

int v[nmax],arbore[4*nmax],maxim,n,m;

void build(int nod,int poz,int val,int st,int dr)
{
    int mid=(st+dr)/2;
    if (st==poz&&st==dr)
    {
        arbore[nod]=val;
        return;
    }
    if (poz<=mid)
        build(nod*2,poz,val,st,mid);
    else
        build(nod*2+1,poz,val,mid+1,dr);
    arbore[nod]=max(arbore[nod*2],arbore[nod*2+1]);
}

void query(int nod,int x,int y,int st,int dr)
{
    int mid=(st+dr)/2;
    if (st>=x&&dr<=y)
    {
        maxim=max(maxim,arbore[nod]);
        return;
    }
    if (st>y||dr<x)
        return;
    query(nod*2,x,y,st,mid);
    query(nod*2+1,x,y,mid+1,dr);
}

int main()
{
    f>>n>>m;
    for (int i=1; i<=n; ++i)
    {
        f>>v[i];
        build(1,i,v[i],1,n);
    }
    for (int i=1; i<=m; ++i)
    {
        int x1,x2,x3;
        f>>x1>>x2>>x3;
        if (x1==1)
            build(1,x2,x3,1,n);
        else
        {
            maxim=-1;
            query(1,x2,x3,1,n);
            g<<maxim<<'\n';
        }
    }
    return 0;
}