Cod sursa(job #2625064)

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

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

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

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

    int lq= RMQ(l,r,l,mid,2*pos+1);
    int rq = RMQ(l,r,mid+1,r,2*pos+2);

    return max(lq, rq);
}

void update(int pos, int newvalue, int l = 0, int r  = N - 1, int cpos = 0)
{
    if(l == r)
    {
        rmq[cpos] = newvalue;
    }
    else{
    int mid = (l + r)/2;
    if(pos <= mid)
        update(pos, newvalue, l, mid, cpos*2 + 1);
    else
        update(pos, newvalue, mid + 1, r, cpos*2 + 2);

    rmq[cpos] = max(rmq[cpos*2 + 1], rmq[cpos*2+1]);
    }
}

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

    return 0;
}