Pagini recente » Cod sursa (job #2751145) | Cod sursa (job #758040) | Cod sursa (job #864466) | Cod sursa (job #1972371) | Cod sursa (job #1749165)
#include <fstream>
#include <iostream>
#include <vector>
#include <climits>
#include <math.h>
#define dim 100001
using namespace std;
int m, n, aux, start = 0, p1, p2, arb_size, a, b;
vector<int> original;
ifstream infile("arbint.in");
ofstream outfile("arbint.out");
void constructTree (vector<int> &arbore, int start, int end, int poz) {
if (start == end) {
arbore[poz] = original[start];
return;
}
int mid = (start + end) / 2;
constructTree(arbore, start, mid, poz * 2 + 1);
constructTree(arbore, mid + 1, end, poz * 2 + 2);
arbore[poz] = max(arbore[poz * 2 + 1], arbore[poz * 2 + 2]);
}
int findMax (vector<int> &arbore, int start, int end, int poz) {
if (start >= a && b >= end)
return arbore[poz];
if (b < start || a > end)
return INT_MIN;
int mid = (start + end) / 2;
return max(findMax(arbore, start, mid, poz * 2 + 1), findMax(arbore, mid + 1, end, poz * 2 + 2));
}
int nextPow2 ()
{
if (n < 0)
return 0;
-- n;
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
return n + 1;
}
int main() {
infile >> n >> m;
for (int i = 0; i < n; i ++) {
infile >> aux;
original.push_back(aux);
}
arb_size = nextPow2() * 2 - 1;
vector<int> arbore(arb_size);
infile >> aux;
while (aux == 1) {
infile >> p1 >> p2;
original[p1 - 1] = p2;
start ++;
infile >> aux;
}
constructTree (arbore, 0, original.size() - 1, 0);
for (int i = start; i < m; i ++) {
infile >> p1 >> p2;
a = p1 - 1;
b = p2 - 1;
if (aux == 0)
outfile << findMax(arbore, 0, original.size() - 1, 0) << endl;
else {
arbore.clear();
original[p1 - 1] = p2;
constructTree (arbore, 0, original.size() - 1, 0);
}
if (i != m - 1)
infile >> aux;
}
return 0;
}