Pagini recente » Cod sursa (job #2779473) | Cod sursa (job #2807276) | Cod sursa (job #1779470) | Cod sursa (job #2749221) | Cod sursa (job #2060194)
#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int NMax = 1e5 + 5;
int a[NMax];
int interval[NMax];
int length;
void Maxim_Interval(int x, int y)
{
int maxim = 0;
for(int i = x/length + 1; i <= y/length - 1; ++i) { // intervalele comune dintre a si b
if(interval[i] > maxim) {
maxim = interval[i];
}
}
if(x/length == y/length) { // a si b se afla in acelasi interval
for(int i = x; i <= y; ++i) {
if(a[i] > maxim) {
maxim = a[i];
}
}
g << maxim << '\n';
}
else {
for(int i = x; i/length == x/length; ++i) { // intervalul in care se afla a si nu e comun cu b
if(a[i] > maxim) {
maxim = a[i];
}
}
for(int i = y; i/length == y/length; --i) { //intervalul in care se afla b si nu e comun cu a
if(a[i] > maxim) {
maxim = a[i];
}
}
g << maxim << '\n';
}
}
void Update(int x, int y)
{
a[x] = y; // elementul de pe pozitia x il facem y si apoi trebuie sa reactualizam maximul din intervalul respectiv
interval[x/length] = -1;
for(int i = x/length * length; i < x/length * length + length; ++i) {
if(a[i] > interval[x/length]) {
interval[x/length] = a[i];
}
}
}
int main()
{
int n, m;
f >> n >> m;
length = (int)sqrt(n);
for(int i = 1; i <= n; ++i) {
f >> a[i];
}
for(int i = 1; i <= n; ++i) { // contruiesc intervalele
if(a[i] > interval[i / length]) {
interval[i / length] = a[i]; // pastrez maximul in intervalul i/length
}
}
for(int i = 1; i <= m; ++i) {
bool prob;
int a, b;
f >> prob;
f >> a >> b;
if(prob == 0) {
Maxim_Interval(a, b);
}
else {
Update(a, b);
}
}
return 0;
}