Cod sursa(job #1677971)

Utilizator mariakKapros Maria mariak Data 6 aprilie 2016 21:49:58
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#define NMAX 100002
FILE *fin  = freopen("arbint.in", "r", stdin);
FILE *fout = freopen("arbint.out", "w", stdout);

using namespace std;
int T[2 * NMAX], sol;
int Max(int x, int y)
{
    if(x > y)
        return x;
    return y;
}
void update(int node, int st, int dr, int pos, int val)
{
    int mid;
    if(st == dr)
        T[node] = val;
    else
    {
        mid = (st + dr) / 2;
        if(pos <= mid)
            update(2 * node, st, mid, pos, val);
        else update(2 * node + 1, mid + 1, dr, pos, val);
        T[node] = Max(T[2 * node], T[2 * node + 1]);
    }
}
void query(int node, int st, int dr, int a, int b)
{
    int mid;
    if(st >= a && dr <= b)
    {
        sol = Max(sol, T[node]);
        return;
    }
    mid = (st + dr) / 2;
    if(a <= mid)
        query(2 * node, st, mid, a, b);
    if(b >= mid + 1)
        query(2 * node + 1, mid + 1, dr, a, b);

}
int main()
{
    int n, m, i, t, a, b;
    scanf("%d %d", &n, &m);
    for(i = 1; i <= n; ++ i)
    {
        scanf("%d", &a);
        update(1, 1, n, i, a);
    }
    /// query
    while(m -- )
    {
        scanf("%d %d %d", &t, &a, &b);
        if(t == 0)
        {
            sol = -1;
            query(1, 1, n, a, b);
            printf("%d\n", sol);
        }
        else update(1, 1, n, a, b);
    }
    return 0;
}