Cod sursa(job #2497877)

Utilizator cristina-criCristina cristina-cri Data 23 noiembrie 2019 11:50:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int n, m, x[100005], ai[400005], cer, a, b;

void pune(int i, int j, int pozInSir)
{
    if(i == j)
    {
        ai[pozInSir]=x[i];
        return;
    }
    int mij=(i+j)/2;
    pune(i, mij, pozInSir*2);
    pune(mij+1, j, pozInSir*2+1);
    ai[pozInSir]=max(ai[pozInSir*2], ai[pozInSir*2+1]);
}

void update(int i, int j, int pozInSir, int poz, int x)
{
    if(i == j)
    {
        ai[pozInSir]=x;
        return;
    }
    int mij=(i+j)/2;
    if(poz <= mij)
        update(i, mij, pozInSir*2, poz, x);
    else
        update(mij+1, j, pozInSir*2+1, poz, x);
    ai[pozInSir]=max(ai[pozInSir*2], ai[pozInSir*2+1]);
}

int afla(int st, int dr, int i, int j, int pozInSir)
{
    if(dr<st)
        return 0;
    if(i <= st && j >= dr)
        return ai[pozInSir];
    int mij=(st+dr)/2;
    int vst=0, vdr=0;
    if(i > mij)
        vdr=afla(mij+1, dr, i, j, pozInSir*2+1);
    else if(j <= mij)
        vst=afla(st, mij, i, j, pozInSir*2);
    else
    {
        vst=afla(st, mij, i, j, pozInSir*2);
        vdr=afla(mij+1, dr, i, j, pozInSir*2+1);
    }

    return max(vst, vdr);
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    scanf("%d %d", &n, &m);

    for(int i=1; i<=n; i++)
        scanf("%d", &x[i]);
    pune(1, n, 1);
    for(int i=1; i<=m; i++)
    {
        scanf("%d %d %d", &cer, &a, &b);
        if(cer == 0)
        {
            printf("%d\n", afla(1, n, a, b, 1));
            continue;
        }
        update(1, n, 1, a, b);
    }

    return 0;
}