Cod sursa(job #144070)

Utilizator blasterzMircea Dima blasterz Data 27 februarie 2008 10:18:36
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
using namespace std;
#include <cstdio>
#include <algorithm>
#define maxn 100001

int H[3*maxn], n,m,sol;


inline void update(int n, int l, int r, int p, int v)
{
    if(l>=r) {H[n]=v; return;}

    int m=(l+r)>>1;
    if(p<=m)  update(n<<1, l, m, p, v);
	else  update((n<<1)|1, m+1, r, p, v);
    H[n]=max(H[n<<1], H[(n<<1)|1]);
}

inline void query(int n, int l, int r, int a, int b)
{
    if(a<=l && r<=b) {sol=max(sol, H[n]); return;}

    int m=(l+r)>>1;

    if(a<=m) query(n<<1, l, m, a,b);
    if(b>m) query((n<<1)|1, m+1,r, a, b);
}


int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d\n", &n, &m);
    int v,i;
    for(i=1;i<=n;++i) 
    {
	scanf("%d ", &v);
	update(1, 1, n, i, v);
    }
    int t, p,q;
    while(m--)
    {
	scanf("%d %d %d\n", &t,&p, &q);
	if(t==0)
	{
	    sol=0;
	    query(1, 1, n, p, q);
	    printf("%d\n", sol);
	}

	else update(1, 1, n, p, q);

    }
    return 0;
}