Cod sursa(job #530952)

Utilizator icepowdahTudor Didilescu icepowdah Data 8 februarie 2011 18:31:56
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
using namespace std;

#define NMAX 100001

struct nod {
	int st, dr;
	int max;
};

ifstream f("arbint.in"); ofstream g("arbint.out");
int N, M;
int arb_int[2*NMAX];

void update(int nod, int st, int dr, int a, int b, int val) {
	if (a<=st && b>=dr) {
		arb_int[nod] = val;
	}
	else {
		int mid = (st+dr)/2;
		if (a<=mid) update(2*nod,st,mid,a,b,val);
		if (b>mid) update(2*nod+1,mid+1,dr,a,b,val);
		arb_int[nod] = max(arb_int[2*nod],arb_int[2*nod+1]);
	}
}

int query(int nod, int st, int dr, int a, int b) {
	if (a<=st && b>=dr) {
		return arb_int[nod];
	}
	int mid = (st+dr)/2;
	int max_st = INT_MIN, max_dr=INT_MIN;
	if (a<=mid) max_st = query(2*nod,st,mid,a,b);
	if (b>mid) max_dr = query(2*nod+1,mid+1,dr,a,b);
	return max(max_st, max_dr);
}

int main() {
	int i,x,cod,a,b;	
	f>>N>>M;
	for (i=1;i<=N;i++) {
		f>>x;
		update(1,1,N,i,i,x);
	}
	for (i=1;i<=M;i++) {
		f>>cod>>a>>b;
		if (cod) update(1,1,N,a,a,b);
		else g<<query(1,1,N,a,b)<<"\n";
	}
	f.close(); g.close();
	return 0;
}