Cod sursa(job #2504967)

Utilizator lucianul31Moisii Lucian lucianul31 Data 5 decembrie 2019 21:24:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include<bits/stdc++.h>

using namespace std;

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

const int NMAX=100005;
int Arbore[4*NMAX], n, m, R;

void build(int nod, int st, int dr)
{
    if(st==dr)
        in>>Arbore[nod];
    else
    {
        int mid=(st+dr)/2;
        build(nod*2, st, mid);
        build(nod*2+1, mid+1, dr);
        Arbore[nod]=max(Arbore[2*nod], Arbore[nod*2+1]);
    }
}

void update(int nod, int st, int dr, int x, int y)
{
    if(st==dr)
    {
        Arbore[nod]=y;
        return;
    }
    int mid=(st+dr)/2;
    if(x<=mid)
        update(nod*2, st, mid, x, y);
    if(x>mid)
        update(nod*2+1, mid+1, dr, x, y);
    Arbore[nod]=max(Arbore[2*nod], Arbore[2*nod+1]);
}

int query(int nod, int st, int dr, int x, int y)
{
    if(st>=x && y>=dr)
    {
        R=max(R, Arbore[nod]);
    }
    else
    {
        int mid=(st+dr)/2;
        if(x<=mid)
            query(nod*2, st, mid, x, y);
        if(mid+1<=y)
            query(nod*2+1, mid+1, dr, x, y);
    }
}

int main()
{
    in>>n>>m;

    build(1, 1, n);

    int p, x, y;
    for(int i=1; i<=m; i++)
    {
        in>>p>>x>>y;
        if(p==1)
            update(1, 1, n, x, y);
        else
            query(1, 1, n, x, y), out<<R<<'\n', R=0;
    }
    return 0;
}