Cod sursa(job #2604538)

Utilizator AndreosAndrei Otetea Andreos Data 22 aprilie 2020 20:49:08
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#define max(a, b) ((a > b) ? a : b)

using namespace std;

int n, m, c, x, y, i, val,v[100000], arbint[262144], p2 = 1;

void update(int x, int y, int st, int dr, int pos)
{
    if(st==dr)
        arbint[pos]=y;
    else
    {
        int m=(st+dr)>>1;
        if(x<=m)
            update(x,y,st,m,(pos<<1));
        else
            update(x,y,m+1,dr,(pos<<1)+1);
        arbint[pos] = max(arbint[pos << 1], arbint[(pos << 1) + 1]);
    }

}

int query(int x, int y, int st, int dr, int pos) {
    if(x <= st && dr <= y)
        return arbint[pos];
    else if(x > dr || y < st)
        return 0;
    else {
        int m = (st + dr) / 2;
        return max(query(x, y, st, m, 2*pos), query(x, y, m+1, dr, 2*pos+1));
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(p2 = 1; p2 <= n; p2 <<= 2);
    for(i = 1; i <= n; ++i)
    {
        scanf("%d", &y);
        update(i, y,1,n,1);
    }
    for(i = 1; i <= m; ++i)
    {
        scanf("%d%d%d", &c, &x, &y);
        if(c == 0)
            printf("%d\n", query(x, y, 1, n, 1));
        else
            update(x, y,1,n,1);
    }
}