Cod sursa(job #2986645)

Utilizator Bogdan405Mocrei Bogdan Bogdan405 Data 28 februarie 2023 21:01:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

long long a[500005],v[100006],op,n,k,w;

void Build(int nc, int p, int q)
{
    if (p==q)
    {
        a[nc]=v[p];
        return;
    }
    int m=(p+q)/2;
    Build(2*nc,p,m);
    Build(2*nc+1,m+1,q);
    a[nc]=max(a[2*nc],a[2*nc+1]);
}

void Update(int nc, int p, int q, int poz, int val)
{
    if (p==q)
    {
        a[nc]=val;
        return;
    }
    int m=(p+q)/2;
    if (poz<=m)
        Update(2*nc,p,m,poz,val);
    else
        Update(2*nc+1,m+1,q,poz,val);
    a[nc]=max(a[2*nc],a[2*nc+1]);
}

long long Query(int nc, int p, int q, int x, int y)
{
    if (x<=p and q<=y)
        return a[nc];
    int m=(p+q)/2,ans1=0,ans2=0;
    if (x<=m)
        ans1=Query(2*nc,p,m,x,y);
    if (m<y)
        ans2=Query(2*nc+1,m+1,q,x,y);
    return max(ans1,ans2);
}

int main()
{
    int i,x,y;
    f >> n >> k;
    for (i=1;i<=n;i++)
        f >> v[i];
    Build(1,1,n);
    for (i=1;i<=k;i++)
    {
        f >> op >> x >> y;
        if (op==1)
            Update(1,1,n,x,y);
        else
        {
            w=Query(1,1,n,x,y);
            g << w << '\n';
        }
    }
    return 0;
}