Cod sursa(job #2115475)

Utilizator ioana_marinescuMarinescu Ioana ioana_marinescu Data 26 ianuarie 2018 19:58:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>
const int MAX_N = 100005;
const int MAX_ARB_INT_N = 1<<18;
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, a[MAX_N], arbInt[MAX_ARB_INT_N];

void build(int nod, int st, int dr)
{
    if(st==dr)
        arbInt[nod]=a[st];
    else {
        int mij=(st+dr)/2;
        build(2*nod, st, mij);
        build(2*nod+1, mij+1, dr);
        arbInt[nod]=max(arbInt[2*nod], arbInt[2*nod+1]);
    }
}

void update(int nod, int st, int dr, int index, int newValue)
{
    assert(st<=index &&index<=dr);
    if(st==dr)
        arbInt[nod]=newValue;
    else {
        int mij=(st+dr)/2;
        if(index<=mij) ///index e din fiul st
            update(2*nod, st, mij, index, newValue);
        else
            update(2*nod+1, mij+1, dr, index, newValue);
        arbInt[nod]=max(arbInt[2*nod], arbInt[2*nod+1]);
    }
}

int query(int nod, int st, int dr, int left, int right)
{
    assert(st<=left && left<=right && right<=dr);
    if(st==left && dr==right)
        return arbInt[nod];
    else {
        int mij=(st+dr)/2;
        if(right<=mij)
            return query(2*nod, st, mij, left, right);
        else if(mij<left)
            return query(2*nod+1, mij+1, dr, left, right);
        else
            return max(query(2*nod, st, mij, left, mij),
                       query(2*nod+1, mij+1, dr, mij+1, right));

    }
}

int main()
{
    int i, q, left, right, index, newValue;
    fin>>n>>m;
    for(i=1; i<=n; i++)
        fin>>a[i];
    build(1, 1, n);
    for(i=1; i<=m; i++) {
        fin>>q;
        if(q==0) {
            fin>>left>>right;
            fout<<query(1, 1, n, left, right)<<'\n';
        }
        else {
            fin>>index>>newValue;
            update(1, 1, n, index, newValue);
        }
    }
    return 0;
}