Cod sursa(job #2182616)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 22 martie 2018 15:36:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
using namespace std;
ofstream out("arbint.out");
ifstream in("arbint.in");
int pos, val, start, finish, maxim;
int maxArb[400001];
int max(int c, int d)
{
    if(c > d) return c;
    else return d;
}
void update(int nod, int left, int right)
{
    if(left == right)
    {
        maxArb[nod] = val;
        return;
    }

    int mid = (left+right)/2;
    if(pos <= mid) update(2*nod, left, mid);
    else update(2*nod+1, mid+1, right);

    maxArb[nod] = max (maxArb[2*nod], maxArb[2*nod+1]);
}

void query(int nod, int left, int right)
{
    if(start <= left && right <= finish)
    {
        if(maxim < maxArb[nod])
            maxim = maxArb[nod];
        return;
    }

    int mid = (left + right)/2;
    if(start <= mid) query(2*nod, left, mid);
    if(mid < finish) query(2*nod+1, mid+1, right);
}

int main()
{
    int n, m;
    in >> n >> m;
    for(int i=1; i<=n; i++)
    {
        int x;
        in >> x;
        pos = i; val = x;
        update(1,1,n);
    }

    for(int i=1; i<=m; i++)
    {
        int x, a, b;
        in >> x >> a >> b;
        if(x==0)
        {
            maxim = -1;
            start = a; finish = b;
            query(1,1,n);
            out << maxim << "\n";
        }else{
            pos = a;
            val = b;
            update(1,1,n);
        }
    }

    return 0;
}