Cod sursa(job #2631116)

Utilizator sebi81georgescuGeorgescu Sebastian sebi81georgescu Data 29 iunie 2020 00:58:35
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,i,tip,l,r,arb[2*100000+5],a[100000+10],pos,x,mx;
void update(int node,int pos,int left,int right,int x)
{
    if(left==right)
    {
        arb[node]=x;
        return;
    }
    int mid=(left+right)/2;
    if(pos<=mid)
    {
        update(node*2,pos,left,mid,x);
    }
     else
        update(node*2+1,pos,mid+1,right,x);

    arb[node] = max(arb[node*2],arb[node*2+1]);
}
void query(int node, int left,int right,int l,int r)
{
    int mx=-1;
    if(l<=left && right>=r)
        {
              mx = max(mx, arb[node]);
             return;
        }
    int mid=(left+right)/2;

    if(l<mid)
    {
      query(2 * node, left, mid, l, r);
    }
    if(mid<r)
    {
    query(2 * node+1, mid+1, right, l, r);
    }


}
void create(int node, int left, int right)
{
    if (left == right)
    {
        arb[node] = a[left];
        return;
    }
    int mid = (left+right)/2;
    create(node*2, left, mid);
    create(node*2+1, mid+1, right);
    arb[node]=max(arb[node*2],arb[node*2+1]);
}
int main()
{
    f>>n>>m;

    for(i=1; i<=n; i++)
    {
        f>>a[i];
    }
    create(1, 1, n);
    for(i=1;i<=m;i++)
    {
        f>>tip;
        if(tip==1)
        {
            f>>pos>>x;
            update(1,pos,1,n,x);
        }
        else{
            mx=-1;
            f>>l>>r;
            query(1,1,n,l,r);
            g<<mx<<'\n';
        }

    }

    return 0;
}