Cod sursa(job #396148)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 14 februarie 2010 16:59:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <stdio.h>

#define maxim(a, b) ((a > b) ? a : b)

int N, M;
int A[262144];

void update(int nod, int left, int right, int poz, int val)
{
    if (left == right)
            A[nod] = val;
	        else
		    {
		            int m = (left + right) / 2;
			            if (poz <= m)
				                update(2*nod,left,m,poz,val);
						        else
							            update(2*nod+1,m+1,right,poz,val);
								            A[nod] = maxim(A[2*nod], A[2*nod+1]);
									        }
										}

										int query(int nod, int left, int right, int a, int b)
										{
										    if (a <= left && right <= b)
										            return A[nod];
											            
												        int m = (left+right)/2;
													    int i1 = 0, i2 = 0;
													        if (a <= m)
														        i1 = query(2*nod, left, m, a, b);
															    if (b > m)
															            i2 = query(2*nod+1, m+1, right, a, b);
																        return maxim(i1, i2);
																	}

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

																			    scanf("%d %d", &N, &M);
																			        for (i = 1; i <= N; ++i)
																				    {
																				            scanf("%d", &x);
																					            update(1, 1, N, i, x);
																						        }
																							    
																							        while (M--)
																								    {
																								            scanf("%d %d %d", &tip, &x, &y);
																									            if (tip == 0)
																										                printf("%d\n", query(1, 1, N, x, y));
																												        else
																													            update(1, 1, N, x, y);
																														        }

																															    return 0;
																															    }