Cod sursa(job #1513578)

Utilizator adimAlexander Dmitriev adim Data 29 octombrie 2015 18:49:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
// Arbori de intervale
#include <bits/stdc++.h>
#define NMax 4000005
using namespace std;

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

int n, m;
int A[NMax];
int st = 0, dr = 0;

inline int maxim(int a, int b) {
	if (a>b)
		return a;
	return b;
}

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

int query(int nod, int left, int right) {
	if (st <= left && right <= dr) {
		return A[nod];
	}
	
	int mij = (left+right)/2;
	if (dr <= mij) {
		return query(2*nod, left, mij);
	} else if (st > mij) {
		return query(2*nod+1, mij+1, right);
	} else {
		return maxim(query(2*nod, left, mij), query(2*nod+1, mij+1, right));
	}
}

int main() {
	
	f>>n>>m;
	for (int i=1;i<=n;i++) {
		int x;
		f>>x;
		update(x,1,1,n,i);
	}
	
	for (int i=1;i<=m;i++) {
		int tip, a, b;
		f>>tip>>a>>b;
		if (tip == 0) {
			st = a;
			dr = b;
			g<<query(1, 1, n)<<'\n';
		} else {
			update(b,1,1,n,a);
		}
	}
	
	f.close(); g.close();
	return 0;
}