Pagini recente » Cod sursa (job #1977137) | Cod sursa (job #3166814) | Cod sursa (job #1021363) | Cod sursa (job #2280638) | Cod sursa (job #1020597)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
struct nod {
int bg, end;
int maxim;
};
nod arb[100000];
int size = 0;
int n, m, v[100000];
void build(int a, int b, int index){
size ++;
arb[index].bg = a;
arb[index].end = b;
if(a < b){
int mij = (a+b)/2;
build(a, mij, 2*index);
build(mij+1, b, 2*index + 1);
}
if(a == b)
arb[index].maxim = v[a];
}
void setMaxim(){
int poz = size;
while(poz > 0){
int val_max = max(arb[poz].maxim, arb[poz-1].maxim);
arb[(poz-1)/2].maxim = val_max;
poz -=2;
}
}
int max_val;
void max_interval(int index, int st, int fs, int a, int b){
if(a <= st && b >= fs){
if(arb[index].maxim > max_val){
max_val = arb[index].maxim;
}
}else if(a <=b){
int mij = (st + fs)/2;
if(mij > b){
max_interval(2*index, st, mij, a, b);
}else if(mij < a){
max_interval(2*index+1, mij+1,fs,a,b);
}else{
max_interval(2*index,st,mij,a,mij);
max_interval(2*index+1,mij+1, fs, mij+1,b);
}
}
}
int main()
{
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
fin >> n >> m;
for(int i=1; i<=n; i++){
fin >> v[i];
}
build(1,n,1);
setMaxim();
int cmd, a, b;
for(int i=1; i<=m; i++){
fin >> cmd >> a >> b;
if(cmd == 0){
max_val = v[a];
max_interval(1,1,n,a,b);
fout << max_val << '\n';
}else{
v[a] = b;
for(int j=1; j<=size; j++)
if(arb[j].bg == arb[j].end && arb[j].bg == a){
arb[j].maxim = b; break;
}
setMaxim();
}
}
return 0;
}