Cod sursa(job #2172109)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 15 martie 2018 15:05:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int Dim = 100001;
int Tree[Dim * 4 +55];
int n,m,ma;

void Get(int &x);
void Update(int node, int le,int ri,int poz,int val);
void Query(int node, int le , int ri , int a,  int b) ;

int main() {
	
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	Get(n) ; Get(m);
	int type , x , y;
	for ( int i = 1; i <= n; ++i) {
		Get(x);
		Update(1,1,n,i,x);
		}
	for ( int i = 1; i <= m; ++i) {
		Get(type) , Get(x) , Get(y);
		if ( type == 1) Update(1,1,n,x,y);
		else { ma = 0;
			Query(1,1,n,x,y);
			printf("%d\n" , ma);
			}
		}
	
}

void Update(int node, int le,int ri,int pos ,int val) {
if(le == ri) {
    Tree[node] = val;
    return ;
}
int mj = (le + ri) / 2;
if( pos <= mj)
    Update(node * 2, le, mj , pos , val);
    else
    Update(node * 2 + 1 , mj + 1 , ri , pos , val);
    Tree[node] = max (Tree[node * 2] , Tree[node * 2 + 1]);
}
void Query(int node , int le , int ri , int a , int b){
    if(a <= le and b >= ri) {
    ma = max (ma,Tree[node]);
    return ;
    }
int mj = (le + ri) / 2;
if(a <= mj)
    Query(2 * node, le , mj, a , b);
if(b > mj)
    Query(2 * node + 1, mj + 1 , ri ,a , b);
}
const int Lim = 100001;
int u = Lim - 1;
char s[Lim];

void Next() {
	
	if ( ++u == Lim)
		fread(s,1,Lim,stdin) , u = 0;
}

void Get(int &x) {
	
	x = 0;
	for (;s[u] < '0' or s[u] > '9'; Next())
	;
	for (; s[u] >= '0' and s[u] <= '9'; Next())
			x = x * 10 + s[u] - '0'; 
}