Cod sursa(job #2631115)

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

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,i,tip,l,r,arb[4*100000+5],a[100000+10],pos,x;
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]);
}
int query(int node, int left,int right,int l,int r)
{
    if(l<=left && right>=r)
        return arb[node];
    int mid=(left+right)/2;
       int mx=-1;
    if(l<mid)
    {
        mx=max(mx,query(node*2,left,mid,l,r));
    }
    if(mid<r)
    {
        mx=max(mx,query(node*2+1,mid+1,right,l,r));
    }
    return mx;

}
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{
            f>>l>>r;
            g<<query(1,1,n,l,r)<<'\n';
        }

    }

    return 0;
}