Cod sursa(job #3005337)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 16 martie 2023 21:33:31
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#define dim 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int tree[4*dim], v[dim];

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

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

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

int main()
{
    int n, q, i, a, b, t;
    fin>>n>>q;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    build(1, 1, n);
    for(i=1;i<=q;i++)
    {
        fin>>t>>a>>b;
        if(t==0)
        {
            fout<<query(1, 1, n, a, b)<<"\n";
        }
        else
        {
            v[a]=b;
            update(1, 1, n, a);
        }
    }
}