Cod sursa(job #1222585)

Utilizator roxana.istratePoenaru Roxana roxana.istrate Data 23 august 2014 17:33:21
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <vector>
#include <math.h>

using namespace std;

int n, m, x, op, f, s;
vector<int> A;
int M[100001];

void initialize(int nod, int i, int j){
	if (i == j) M[nod] = i;
	else{
		initialize(2 * nod, i, (i + (j - i) / 2));
		initialize(2 * nod + 1, (i + (j - i) / 2) + 1, j);

		//(A[M[2 * nod]] >= A[M[2 * nod + 1]])? M[nod] = A[M[2 * nod]] : M[nod] = A[M[2 * nod + 1]];
	}
}

int query(int nod, int b, int e, int f, int s){
	if (e < f || s < b) return -1;

	if (b >= f && e <= s) return M[nod];

	int p1 = query(2 * nod, b, (b + e) / 2, f, s);
	int p2 = query(2 * nod + 1, (b + e) / 2 + 1, e, f, s);

	//return the position where the overall 
	//minimum is
	if (p1 == -1)
		return M[nod] = p2;
	if (p2 == -1)
		return M[nod] = p1;
	if (A[p1] >= A[p2])
		return M[nod] = p1;
	return M[nod] = p2;
}

int main(){
	//freopen("arbint.in", "r", stdin);
	//freopen("arbint.out", "w", stdout);
	//scanf("%d%d", &n, &m);
	cin >> n >> m;
	for (int i = 0; i < n; i++){
		// scanf("%d", &x);
		cin >> x; A.push_back(x);
	}
	initialize(1, 0, n - 1);
	for (int i = 0; i < m; i++){
		cin >> op >> f >> s;
		//scanf("%d%d%d", &op, &f, &s);
		switch (op){
		case 1: 
			query(1, 0, n-1, f, s);
			break;
		}
	}
	
	return 0;
}