Cod sursa(job #148533)

Utilizator QbyxEros Lorand Qbyx Data 4 martie 2008 15:03:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#define nmax 100002

int fa[nmax * 5], n, m, MAX, z, x, y;

int max(int a, int b)
{
    if (a > b) return(a); else return(b);
}

void update(int nod, int left, int right, int val, int pos)
{
    if (left == right)
    {
	fa[nod] = val;
	return;
    }

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

    fa[nod] = max(fa[nod << 1], fa[(nod << 1) + 1]); 
}

void query(int nod, int left, int right, int a, int b)
{
    if (a <= left && right <= b)
    {
       if (MAX < fa[nod]) MAX = fa[nod];
       return;
    }
    
    int k = (left + right) / 2;

    if (a <= k) query(nod << 1, left, k, a, b);
    if (k < b) query((nod << 1) + 1, k + 1, right, a, b);
}

int main()
{
    freopen("arbint.in","rt", stdin);
    freopen("arbint.out", "wt", stdout);

    scanf("%d %d", &n, &m);

    for (int i = 1; i <= n; ++i)
    {
	scanf("%d", &MAX);
	update(1,1,n,MAX,i);
    }

    for (int i = 1; i <= m; ++i)
    {
	scanf("%d %d %d", &z, &x, &y);
	
	if (z == 1)
	    update(1,1,n,y,x);
	else
	{
	    MAX = -1;
	    query(1,1,n,x,y);
	    printf("%d\n", MAX);
	}
    }
}