Cod sursa(job #1741087)

Utilizator Bulgaru_Robert_Razvan_323CBBulgaru Robert Razvan Bulgaru_Robert_Razvan_323CB Data 12 august 2016 22:57:59
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int tree[4*100000+5];
int N,M,maxi,mid,val,a,b,op;

void update(int node,int left,int right,int pos,int val) {
	if (left==right) {
		tree[node]=val;
		return;
	}

	mid=left+(right-left)/2;
	if (pos<=mid) 
		update(2*node,left,mid,pos,val);
	else
		update(2*node+1,mid+1,right,pos,val);

	tree[node]=max(tree[2*node],tree[2*node+1]);
}

void query(int node,int left,int right,int a,int b) {
	if (a<=left && right<=b) {
		maxi=max(tree[node],maxi);
		return; 
	}

	mid=left+(right-left)/2;
	if (a<=mid) query(2*node,left,mid,a,b);
	if (b>mid)  query(2*node+1,mid+1,right,a,b);
}

int main() {
	in>>N>>M;
	for (int i=1;i<=N;i++)  {
		in>>val;
		update(1,1,N,i,val);
	}

	for (int i=1;i<=M;i++) {
		in>>op>>a>>b;

		if (op==0) {
			maxi=-1;
			query(1,1,N,a,b);
			out<<maxi<<"\n";
		}

		if (op==1) {
			update(1,1,N,a,b);
		}
	}

	return 0;
}