Cod sursa(job #2381156)

Utilizator cristina-criCristina cristina-cri Data 16 martie 2019 10:09:16
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
#include <algorithm>
#define NMAX 100005
using namespace std;

int a[NMAX], arb[4*NMAX], n, m, op, in, sf;

void upd(int st, int dr, int poz_arb, int el)
{
//    if(st>dr)
//        return;
    if(st == dr)
    {
        if(st == el)
            arb[poz_arb]=a[el];
        return;
    }
    int med=(st+dr)/2;
    upd(st, med, 2*poz_arb, el);
    upd(med+1, dr, 2*poz_arb+1, el);
    arb[poz_arb]=max(arb[2*poz_arb], arb[2*poz_arb+1]);
}

int cauta(int st, int dr, int poz_arb, int a, int b)
{
    if(st>dr)
        return -1;
    if(st > b)
        return -1;
    if(dr < a)
        return -1;
    if(st >= a && dr <= b)
    {
        return arb[poz_arb];
    }
    int med=(st+dr)/2;
    int cst=cauta(st, med, 2*poz_arb, a, b);
    int cdr=cauta(med+1, dr, 2*poz_arb+1, a, b);
    return max(cst, cdr);
}

void updQ(int st, int dr, int poz_arb, int poz, int el)
{
    if(st == dr)
    {
        if(st == poz)
            arb[poz_arb]=el;
        return;
    }
    int med=(st+dr)/2;
    updQ(st, med, 2*poz_arb, poz, el);
    updQ(med+1, dr, 2*poz_arb+1, poz, el);
    arb[poz_arb]=max(arb[2*poz_arb], arb[2*poz_arb+1]);
}

void afisare()
{
    for(int i=1; i<=4*n; i++)
        printf("%d ", arb[i]);
    printf("\n");
}

int main()
{

    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    scanf("%d %d", &n, &m);

    for(int i=1; i<=n; i++)
    {
        scanf("%d", &a[i]);
        upd(1, n, 1, i);
    }
    //printf("%d", arb[1]);
    for(int i=1; i<=m; i++)
    {
        scanf("%d %d %d", &op, &in, &sf);
        if(op == 0)
            printf("%d\n", cauta(1, n, 1, in, sf));
        else
            updQ(1, n, 1, in, sf);
        //afisare();
    }
    return 0;
}