Cod sursa(job #156692)

Utilizator pikuAnca Miihai piku Data 12 martie 2008 18:16:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<cstdio>
#define nmax 100010

int n, m;
int v[5*nmax];

inline int max(int a, int b)
{
 if(a<b)
	return b;
 return a;
}

void update(int x, int l, int r, int c, int val)
{
 if(l==r)
 {
	v[x] = val;
	return;
 }
 int mid = (l+r)/2;
 if(c <= mid)
	update(2*x, l, mid, c, val);
 else
  update(2*x+1, mid+1, r, c, val);
 v[x] = max(v[2*x], v[2*x+1]);
}

int query(int x, int l, int r, int a, int b)
{
 if (a<=l && r<=b)
	return v[x];
 int mx=0, mid=(l+r)/2;
 if(a<=mid)
	mx = query(x*2, l, mid, a, b);
 if(mid<b)
	mx = max(mx, query(x*2+1, mid+1, r, a, b));
 return mx;
}

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

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