Cod sursa(job #2625078)

Utilizator grecuGrecu Cristian grecu Data 5 iunie 2020 18:30:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

int N,M;
int v[100000], rmq[322222];

void build(int pos, int l, int r) {
    if (l == r) {
        rmq[pos] = v[l];
    }
    else{
    int mid = (l + r) / 2;
    build(2 * pos + 1, l, mid);
    build(2 * pos + 2, mid + 1, r);
    rmq[pos] = max(rmq[2 * pos + 1], rmq[2 * pos + 2]);
    }
}

void update(int pos, int a, int b, int l, int r) {
    if (l == r) {
        rmq[pos] = b;
        return;
    }
    int mid = (l + r) / 2;
    if(a <= mid)
        update(2 * pos + 1, a, b, l, mid);
    else
        update(2 * pos + 2, a, b, mid+1, r);
    rmq[pos] = max(rmq[2 * pos + 1], rmq[2 * pos + 2]);
}

int RMQ(int pos, int l, int r, int a, int b)
{
    if (l > a || r < b)
        return 0;
    if (a <= l && b >= r)
        return rmq[pos];
    int mid = l + (r - l) / 2;
    if (a > mid)
        return RMQ(2 * pos + 2, mid + 1, r, a, b);
    else if (b <= mid)
        return RMQ(2 * pos + 1, l, mid, a, b);

    int lQ= RMQ(2 * pos + 1, l, mid, a, mid);
    int rQ = RMQ(2 * pos + 2, mid + 1, r, mid + 1, b);

    return max(lQ, rQ);
}


int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f >> N >> M;
    int i;
    for(i = 0; i < N; i++)
        f >> v[i];
    build(0,0,N-1);
    int a, b, type;
    for (i = 0; i < M; i++){
        f >> type >> a >> b;
        if(type == 1)
            update(0,a-1,b,0,N - 1);
        if(type == 0)
            g << RMQ(0, 0, N - 1, a-1, b-1) << "\n";
    }
    f.close();
    g.close();
    return 0;
}