Cod sursa(job #2001631)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 17 iulie 2017 12:06:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>

using namespace std;

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

int n,q,i,sol,op,x,y;
int v[200011],a[200011];

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

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

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

int main ()
{
    fin >> n >> q;
    for (i=1; i<=n; i++)
        fin >> v[i];
    build(1, 1, n);
    for (;q--;)
    {
        fin >> op >> x >> y;
        if (op == 0)
        {
            sol = 0;
            query(1, 1, n, x, y);
            fout << sol << "\n";
        }
        else
            update(1, 1, n, x, y);
    }
    return 0;
}