Cod sursa(job #2497868)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 23 noiembrie 2019 11:38:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#define NMAX 400016
#include <cstdio>
#include <algorithm>
using namespace std;

int n, q, T, a, b;
int AI[NMAX], V[NMAX/4];


void form_AI(int left, int right, int index)
{
    if(left == right)
    {
        AI[index] = V[left];
        return;
    }
    int mid = (left + right)/2;
    form_AI(left, mid, 2*index);
    form_AI(mid+1, right, 2*index+1);
    AI[index] = max(AI[2*index], AI[2*index+1]);
}





void modify(int left, int right, int index)
{
    if(left == right)
    {
        AI[index] = b;
        return;
    }
    int mid = (left + right)/2;
    if(mid >= a)
        modify(left, mid, 2*index);
    else modify(mid+1, right, 2*index+1);
    AI[index] = max(AI[2*index], AI[2*index+1]);
}


int maxim(int left, int right, int index)
{
    if(a <= left && right <= b)
        return AI[index];
    int maxs = -1, maxdr = -1;
    int mid = (left + right)/2;
    if(a >= mid+1){
        //merg dreapta
        maxdr = maxim(mid+1, right, 2*index+1);
    }
    else if(b <= mid){
        // merg stanga
        maxs = maxim(left, mid, 2*index);
    }
    else{
        // merg ambele
        maxs = maxim(left, mid, 2*index);
        maxdr = maxim(mid+1, right, 2*index+1);
    }

    return max(maxs, maxdr);
}




void read()
{
    scanf("%d %d", &n, &q);
    for(int i=1; i<=n; ++i)
    {
        scanf("%d", &V[i]);
    }
    form_AI(1, n, 1);
}


void solve()
{
    for(int i=1; i<=q; ++i)
    {
        scanf("%d %d %d", &T, &a, &b);
        if(T == 1)
            modify(1, n, 1);
        else printf("%d\n", maxim(1, n, 1));
    }
}



int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    read();
    solve();
    return 0;
}