Cod sursa(job #291053)

Utilizator ScrazyRobert Szasz Scrazy Data 29 martie 2009 12:26:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 100001;

int n, m;
int a[maxn];
int tree[3 * maxn];

void update(int n, int l, int r, int poz, int val)
{
    //fprintf(stderr,"try %d %d %d %d %d\n", n, l, r, poz, val);
    if (l == r)
    { 
	a[l] = val;
	tree[n] = a[l];
	//fprintf(stderr,"supdate %d %d %d %d %d\n", n, l, r, poz, val);
	return ;
    } 

    int mid = (l + r) >> 1;
    if (mid >= poz) update(2 * n, l, mid, poz, val);
    if (mid < poz) update(2 * n + 1, mid + 1, r, poz, val);

    tree[n] = max(tree[2 * n], tree[2 * n + 1]);
    //fprintf(stderr,"updated %d %d %d %d %d\n", n, l, r, poz, val);
}

int res = 0;

void query(int n, int l, int r, int li, int ri)
{
    //fprintf(stderr,"try %d %d %d %d %d\n", n, l, r, li, ri);
    if (li <= l && r <= ri)
    {
	res = max(res, tree[n]);
	//fprintf(stderr,"get %d %d %d %d %d -> %d\n", n, l, r, li, ri, res);
	return ;
    }
    
    int mid = (l + r) >> 1;
    if (li <= mid) query(2 * n, l, mid, li, ri);
    if (ri > mid) query(2 * n + 1, mid + 1, r, li, ri);
}

void debug()
{
    for (int i = 1; i <= 2 * n; ++i)
	fprintf(stderr,"%d ", tree[i]);
    fprintf(stderr,"\n");
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d\n", &n, &m); 
    for (int i = 1; i <= n; ++i) 
    {
	scanf("%d", &a[i]); 
	update(1, 1, n, i, a[i]); 
	//debug();
    }
    for (int i = 1; i <= m; ++i) 
    {
	int tip, a, b; scanf("%d%d%d", &tip, &a, &b);
	if (tip == 0) 
	{
	    res = 0;
	    query(1, 1, n, a, b);
	    printf("%d\n", res);
	}
	else
	    update(1, 1, n, a, b);
    }

    return 0;
}