Cod sursa(job #2701282)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 30 ianuarie 2021 12:00:24
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#define NMAX 400016
#include <cstdio>
#include <algorithm>
using namespace std;

int n, q, T, a, b, p;
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 poz, int val)
{
    int pozAI = p-n+poz-1;
    AI[pozAI] = val;
    pozAI/=2;
    for(int i = pozAI; i >= 1; i/=2)
        AI[i] = max(AI[2*i], AI[2*i+1]);

}


int maxim(int left, int right, int index)
{
    if(a <= left && right <= b)
        return AI[index];
    if(left > b || right < a)
        return 0;
    int mid = (left + right)/2;
    int vms = maxim(left, mid, index*2);
    int vmd = maxim(mid+1, right, index*2+1);
    return max(vms, vmd);

}


void write()
{
    for(int i = 1; i <= p; ++i)
        printf("%d ", AI[i]);
}


void form_AI_I()
{
    for(p = 1; p <= n; p<<=1);
    p += n;
    for(int i = p-n; i <= p; i++)
    {
        AI[i] = V[i-p+n+1];
    }
    for(int i = p-n-1; i >= 1; --i)
        AI[i] = max(AI[2*i], AI[2*i+1]);
 //   write();
}



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


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



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