Cod sursa(job #3131372)

Utilizator arobyRobert Acsente aroby Data 19 mai 2023 22:30:33
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m, a[100001], x, y, arb[400001];

void create(int node, int left, int right)
{
    if (left == right)
        arb[node] = a[left];
    else
    {
        create(2 * node, left, (left + right) / 2);
        create(2 * node + 1, (left + right) / 2 + 1, right);
        if (a[arb[2 * node]] > a[arb[2 * node + 1]])
            arb[node] = a[arb[2 * node]];
        else
            arb[node] = a[arb[2 * node + 1]];
    }
}
void update(int node, int pos, int val, int left, int right)
{
    if (left == right)
        arb[left] = val;
    else
    {
        int mij = (left + right) / 2;
        if (pos > mij)
            update(2 * node + 1, pos, val, mij + 1, right);
        else
            update(2 * node, pos, val, left, mij);

        if (a[arb[2 * node]] > a[arb[2 * node + 1]])
            arb[node] = a[arb[2 * node]];
        else
            arb[node] = a[arb[2 * node + 1]];
    }
}
int query(int node, int left, int right, int i, int j)
{
  

    if (left >= i && right <= j)
        return arb[node];
    else{
        int mij=(left+right)/2;
        if(j<=mij)
            return query(2*node,left,mij,i,j);
        if(i>=mij+1)
        return query(2*node+1,mij+1,right,i,j);
    
    return max(query(2*node,left,mij,i,j),query(2*node+1,mij+1,right,i,j));

    }
 
}

int main()
{

    in >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        in >> a[i];
    }
    int caz;
   
    create(1,1,n);

    for(int i=0;i<m;i++)
    {
        in>>caz>>x>>y;
        if(caz==0)
        {   
           
            out<<query(1,1,n,x,y)<<endl;
        
        }
       else
       {
   
        update(1,x,y,1,n);
       }
    }
}