Cod sursa(job #1623735)

Utilizator leopop29Pop Leonard leopop29 Data 1 martie 2016 21:20:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
//#include <iostream>
#include <fstream>
#define DN 100005

using namespace std;

int v[DN], ai[4*DN];

void build(int poz, int ls, int ld)
{
    if(ls == ld)
    {
        ai[poz] = v[ls];
        return;
    }

    int m = (ls+ld)/2, fs=2*poz;
    build(fs, ls, m);
    build(fs+1, m+1, ld);
    ai[poz] = max(ai[fs], ai[fs+1]);
}

int ma;

void query(int poz, int ls, int ld, int qls, int qld)
{
    if(ld<qls || ls>qld) return;
    if(qls<=ls && ld<=qld)
    {
        ma = max(ma, ai[poz]);
        return;
    }
    int m = (ls+ld)/2, fs = 2*poz;
    query(fs, ls, m, qls, qld);
    query(fs+1, m+1, ld, qls, qld);
}

void update(int nc, int ls, int ld, int poz, int x)
{
    if(ls == ld)
    {
        ai[nc] = x;
        return;
    }
    int m = (ls+ld)/2, fs = 2*nc;
    if(poz<=m) update(fs, ls, m, poz, x);
    else update(fs+1, m+1, ld, poz, x);
    ai[nc] = max(ai[fs], ai[fs+1]);
}

int main()
{
    ifstream f("arbint.in");
    ofstream cout("arbint.out");
    int n, m;
    f >> n >> m;

    for(int i = 1; i <= n; ++i)
        f >> v[i];

    build(1, 1, n);
    for(int i = 1; i <= m; ++i)
    {
        int x, y, z;
        f >> x >> y >> z;
        if(x)
            update(1, 1, n, y, z);
        else
        {
            ma = 0;
            query(1, 1, n, y, z);
            cout << ma << '\n';
        }
    }
    return 0;
}