Cod sursa(job #1526701)

Utilizator diana-t95FMI Tudoreanu Diana Elena diana-t95 Data 17 noiembrie 2015 02:10:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
using namespace std;
#define maxn 100100
int n, m;
int a[maxn], v[2*maxn];

void init(int pos, int st, int dr)
{
    if (dr <= st) v[pos] = a[dr];
        else {
            init(2*pos, st, (dr+st)/2);
            init(2*pos + 1, (dr+st)/2+1, dr);
            v[pos] = max(v[2*pos], v[2*pos+1]);
        }
}
void update(int pos, int st, int dr, int x)
{
    if (st >= dr) {
        v[pos] = a[x];
    } else {
        if (x > (dr+st)/2) {
            update(2*pos+1,(dr+st)/2+1, dr, x);
        } else {
            update(2*pos, st,(dr+st)/2, x);
        }
        v[pos] = max(v[2*pos], v[2*pos+1]);
    }
}
int query(int pos, int st, int dr, int b, int c)
{
    if (c < st || b > dr) return 0;
    if (b <= st && c >= dr) return v[pos];
    return max(query(2*pos, st, (dr+st)/2, b, c), query(2*pos+1, (dr+st)/2+1, dr, b, c));
}
int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f>>n>>m;
    for (int i = 1; i <= n; i++)
    {
        f>>a[i];
    }
    init(1,1,n);
    int op, b, c;
    for (int i = 1; i <= m; i++)
    {
        f>>op>>b>>c;
        if (op == 0)  {
            g<<query(1,1,n,b,c)<<'\n';
        } else {
            a[b] = c;
            update(1, 1, n, b);
        }
    }
}