Cod sursa(job #2765673)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 29 iulie 2021 14:45:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define dim 100002
using namespace std;
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
int n;

struct el
{
    int val;
}aint[dim*4];

el join (el x,el y)
{
    el z;
    z.val=max(x.val,y.val);
    return z;
}

void update (int nod,int st,int dr,int poz,int val)
{
    if (st==dr)
    {
        aint[nod].val=val;
        return ;
    }
    int mij=(st+dr)>>1;
    if (poz<=mij)
        update(2*nod,st,mij,poz,val);
    else
        update(2*nod+1,mij+1,dr,poz,val);
    aint[nod]=join(aint[2*nod],aint[2*nod+1]);
}

void update (int x,int y)
{
    return update(1,1,n,x,y);
}

el query (int nod,int st,int dr,int l,int r)
{
    if (st==l && dr==r)
        return aint[nod];
    int mij=(st+dr)>>1;
    if (r<=mij)
        return query (2*nod,st,mij,l,r);
    else if (mij+1<=l)
        return query (2*nod+1,mij+1,dr,l,r);
    else
        return  join(query(2*nod,st,mij,l,mij),query(2*nod+1,mij+1,dr,mij+1,r));
}

el query (int x,int y)
{
    return query(1,1,n,x,y);
}

int main()
{
    int q,tip,x,y,i;
    fin>>n>>q;
    for (i=1; i<=n; i++)
    {
        fin>>x;
        update (i,x);
    }
    while (q--)
    {
        fin>>tip>>x>>y;
        if (tip==1)
            update(x,y);
        else
        {
            el sol=query(x,y);
            fout<<sol.val<<'\n';
        }
    }
    return 0;
}