Cod sursa(job #2624996)

Utilizator grecuGrecu Cristian grecu Data 5 iunie 2020 17:36:14
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>
using namespace std;

int N,M;
int rmqlen;
int v[100000], rmq[222222];

void inc(int ql, int qh, int l = 0, int h = N - 1, int pos = 0){
}

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

int RMQ(int ql, int qh, int l = 0, int h = N - 1, int pos = 0){
    if(ql <= l && qh >= h)
        return rmq[pos];    // total overlap;
    if(ql > h || qh < l)
        return 100001;    // no overleap;
    int mid = (l + h)/2;
    return min(RMQ(ql, qh, l, mid, 2*pos+1), RMQ(ql, qh, mid+1, h, 2*pos + 2));

}

void update(int pos, int newvalue, int l = 0, int r  = N - 1, int cpos = 1)
{
    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, l, mid, 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;
    rmqlen = N - 1;
    rmqlen |= rmqlen >> 1;
    rmqlen |= rmqlen >> 2;
    rmqlen |= rmqlen >> 4;
    rmqlen |= rmqlen >> 8;
    rmqlen |= rmqlen >> 16;
    rmqlen = 2*rmqlen + 1;
    int i;
    for(i = 0; i < N; i++){
        f >> v[i];
        if (i < rmqlen)
            rmq[i] = 100001;
    }
    for(; i < rmqlen; i++)
        rmq[i] = 100001;
    build(v);
    int x, y, type;
    for (i = 0; i < M; i++){
        f >> type >> x >> y;
        if(type == 1)
            update(x-1,y);
        else
            RMQ(x-1,y-1);
    }

    return 0;
}