Pagini recente » Cod sursa (job #1307592) | Cod sursa (job #329540) | Cod sursa (job #1900198) | Profil CosminCartoful | Cod sursa (job #1386640)
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int n, m;
struct interval { int st, mid, dr; };
struct node
{
interval interv;
int maxi;
node *st, *dr;
node(){}
node(int stanga, int dreapta)
{
interv.st = stanga;
interv.dr = dreapta;
maxi = -1;
if (interv.st != interv.dr){
interv.mid = (interv.st + interv.dr) / 2;
this->st = new node(interv.st, interv.mid);
this->dr = new node(interv.mid + 1, interv.dr);
}
else {
this->st = new node();
this->dr = new node();
}
}
};
node *start;
int pos, val;
void update(node *x)
{
if (x->interv.st == x->interv.dr){
x->maxi = val;
return;
}
if (pos <= x->interv.mid)
update(x->st);
else
update(x->dr);
x->maxi = max(x->st->maxi, x->dr->maxi);
}
int maxim;
interval intervalCitit;
void querry(node *x)
{
if (intervalCitit.st <= x->interv.st && x->interv.dr <= intervalCitit.dr){
maxim = max(maxim, x->maxi);
return;
}
if (intervalCitit.st <= x->interv.mid)
querry(x->st);
if (x->interv.mid < intervalCitit.dr)
querry(x->dr);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int x, k, a, b;
scanf("%d %d\n", &n, &m);
start = new node(1, n);
for (int i = 1; i <= n; ++i){
scanf("%d ", &x);
pos = i;
val = x;
update(start);
}
for (int i = 1; i <= m; ++i){
scanf("%d %d %d\n", &k, &a, &b);
if (k == 1){ /// update
pos = a;
val = b;
update(start);
}
else { /// querry
maxim = -1;
intervalCitit.st = a;
intervalCitit.dr = b;
querry(start);
printf("%d\n", maxim);
}
}
return 0;
}