Nu aveti permisiuni pentru a descarca fisierul grader_test3.in

Cod sursa(job #2199533)

Utilizator danal182001Dana Lica danal182001 Data 28 aprilie 2018 09:45:03
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
#define NMAX 400000

using namespace std;

int Arbore[NMAX], i, j, N, x, y, M, nr, z;

void UpdateElem(int a, int b, int nod, int poz, int val)
{
    if (a==b)
    {
        Arbore[nod]=val;
    }
    else
    {
        int middle=(a+b)/2;
        if (poz<=middle)
            UpdateElem(a, middle, nod*2, poz, val);
        else
            UpdateElem(middle+1, b, nod*2 + 1, poz, val);
        Arbore[nod] = max(Arbore[2*nod], Arbore[2*nod + 1]);
    }
}

int Query(int a, int b, int nod, int left, int right)
{
    int r1=0, r2=0;
    if (left<=a && right>=b)
        return Arbore[nod];
    int middle=(a + b)/2;
    if (left<=middle)
        r1 = Query(a, middle, 2*nod, left, right);
    if (middle<right)
        r2 = Query(middle+1, b, 2*nod+1, left, right);
    return max(r1, r2);
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d\n", &N, &M);
    for (i=1; i<=N; i++)
    {
        scanf("%d", &x);
        UpdateElem(1, N, 1, i, x);
    }
    for (i=1; i<=M; i++)
    {
        scanf("%d %d %d", &x, &y, &z);
        if (x==1)
            UpdateElem(1, N, 1, y, z);
        else
            printf("%d\n",Query(1, N, 1, y, z));
    }
    fclose(stdin); fclose(stdout);
    return 0;
}