Cod sursa(job #2436849)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 7 iulie 2019 14:01:12
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <cstdio>
#include <stdio.h>
using namespace std;
int v[100001], arb[400001], p[100001];

void update(int poz, int val, int st, int dr, int nod)
{
    if(st == dr)
    {
        arb[nod] = val;
        p[poz] = nod;
        return;
    }
    int mid = (st + dr) / 2;
    if(mid >= poz)
        update(poz, val, st, mid, nod * 2);
    if(mid < poz)
        update(poz, val, mid + 1, dr, nod * 2 + 1);
    if(arb[nod * 2] > arb[nod * 2 + 1])
        arb[nod] = arb[nod * 2];
    else
        arb[nod] = arb[nod * 2 + 1];
}

int getmax(int a, int b, int st, int dr, int nod)
{
    if(a <= st && b >= dr)
        return arb[nod];
    int mid = (st + dr) / 2, v1 = 0, v2 = 0;
    if(a <= mid)
        v1 = getmax(a, b, st, mid, nod * 2);
    if(b > mid)
        v2 = getmax(a, b, mid + 1, dr, nod * 2 + 1);
    return v1 > v2 ? v1 : v2;
    return v2;
}

void upd2(int poz, int val)
{
    poz = p[poz];
    while(poz >= 1)
    {
        arb[poz] = val;
        if(arb[poz / 2] < val)
            poz /= 2;
        else
            break;
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int n, i, j, m, t, a, b, poz;
    scanf("%d%d", &n, &m);
    for(i = 1; i <= n; i++)
    {
        scanf("%d", &j);
        update(i, j, 1, n, 1);
    }
    for(i = 0; i < m; i++)
    {
        scanf("%d%d%d", &t, &a, &b);
        if(t == 0)
        {
            printf("%d\n", getmax(a, b, 1, n, 1));
        }
        else
        {
            //update(a, b, 1, n, 1);
            //upd2(a, b);
            poz = p[a];
            arb[poz] = b;
            while(poz >= 2)
            {
                poz /= 2;
                if(arb[poz * 2] > arb[poz * 2 + 1])
                    arb[poz] = arb[poz * 2];
                else arb[poz] = arb[poz*2 + 1];
            }
        }
    }
    return 0;
}