Cod sursa(job #537202)

Utilizator titeltitel popescu titel Data 20 februarie 2011 13:05:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
using namespace std;
#include <cstdio>
#include <algorithm>
#define maxn 100001
int H[4*maxn], n,m,sol,i,v,t,p,q;
inline void update(int node, int st, int dr, int i, int v)
{   if(st>=dr) {H[node]=v; return;}
	int m=(st+dr)/2; 
    if(i<=m)  update(2*node, st, m, i, v);
            else  update(2*node+1, m+1, dr, i, v);
    H[node]=max(H[2*node], H[2*node+1]);
}
inline int query(int node, int st, int dr, int i, int j)
{int mij,sol=0;
	if(i<=st && dr<=j) return H[node];
    mij=(st+dr)/2;
    if(i<=mij) sol=max(sol,query(2*node, st, mij, i,j));
    if(j>mij) sol=max(sol,query(2*node+1, mij+1,dr, i, j));
	return sol;
}
int main()
{   freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d\n", &n, &m);
	for(i=1; i<=n; i++) {scanf("%d", &v); update(1, 1, n, i, v);};
    while(m--)
     {scanf("%d %d %d\n", &t,&p, &q);
	  if(t==0) printf("%d\n", query(1, 1, n, p, q));
		else update(1, 1, n, p, q);
     }
    return 0;
}