Cod sursa(job #1299043)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 23 decembrie 2014 14:23:17
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <climits>

#define NMax 50005

using namespace std;

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

int n, m;
int A[NMax];
int M[4*NMax];
int val;
int pos;
int maxi;
int start, finish;

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

void update(int nod, int left, int right) {

	if (left == right) {
		M[nod] = val;
		return;
	}

	int mij = (left+right)/2;
	if (pos <= mij)
		update(2*nod, left, mij);
	else
		update(2*nod+1, mij+1, right);

	M[nod] = maxim(M[2*nod], M[2*nod+1]);
}

void query(int nod, int left, int right) {
 	
	if (left > right)
		return;

    if (start <= left && right <= finish) {
        maxi = maxim(maxi, M[nod]);
        return;
    }
 
    int mij = (left+right)/2;
    if (start <= mij)
        query(2*nod, left, mij);
    if (mij < finish)
        query(2*nod+1, mij+1, right);
}

void read() {

	f>>n>>m;
	for (int i=1;i<=n;i++) {
		int x;
		f>>x;
		val = x; pos = i;
		update(1,1,n);
	}

	for (int i=1;i<=m;i++) {
		int a, b; f>>a>>b;
		start = a; finish = b;
		maxi = -1;
		query(1,1,n);
		g<<maxi<<endl;
	}
}

int main() {

	read();

	f.close(); g.close();
	return 0;
}