Cod sursa(job #2604539)

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

using namespace std;

int n, m, c, x, y, i, val,maxx,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]);
    }
}

void query(int x, int y, int st, int dr, int pos)
{
    if(x <= st && dr <= y)
        maxx=max(maxx,arbint[pos]);
    else
    {
        int m = (st + dr)>>1;
        if(x<=m)
            query(x, y, st, m, 2*pos);
        if(m<y)
            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)
        {
            maxx=-1;
            query(x, y, 1, n, 1);
            printf("%d\n", maxx);
        }
        else
            update(x, y,1,n,1);
    }
}