Cod sursa(job #2863040)

Utilizator 21CalaDarius Calaianu 21Cala Data 6 martie 2022 11:43:21
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 30005
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n,m,a[NMAX];
void update(int node,int left, int right, int poz, int val)
{
    if(left == right)
    {
        a[node] = val;
        return ;
    }
    int ls = 2*node, rs = 2*node + 1;
    int mid = (left + right) / 2;
    if(left <= poz && poz<=mid)
        update(ls,left,mid,poz,val);
    else
        update(rs,mid+1,right,poz,val);
    a[node] = max(a[ls],a[rs]);
}
int query(int node,int left,int right, int lpoz, int rpoz)
{
    if(lpoz == left && rpoz == right)
        return a[node];
    int ls = 2*node, rs = 2*node + 1;
    int mid = (left + right) / 2;
    if(left <= lpoz && rpoz <= mid)
        return query(ls,left,mid,lpoz,rpoz);
    if(mid+1<=lpoz && rpoz <=right)
        return query(rs,mid+1,right,lpoz,rpoz);
    return max(query(ls,left,mid,lpoz,mid), query(rs,mid+1,right,mid+1,rpoz));
}
void read()
{
    fin >> n >> m;
    for(int i=1;i<=n;++i)
    {
        int x;
        fin >> x;
        update(1,1,n,i,x);
    }
    for(int i=0;i<m;++i)
    {
        int t,a,b;
        fin >> t >> a >> b;
        if(t==0)
            fout << query(1,1,n,a,b) << '\n';
        else
            update(1,1,n,a,b);
    }
}
int main()
{
    read();
    return 0;
}