Pagini recente » Cod sursa (job #2724510) | Cod sursa (job #1945383) | Cod sursa (job #2745290) | Cod sursa (job #826113) | Cod sursa (job #324551)
Cod sursa(job #324551)
#include <fstream>
#define MaxN 131072
struct arb {
int st,dr, val;
};
using namespace std;
fstream fin ("arbint.in",ios::in);
fstream fout("arbint.out",ios::out);
int v[100001], n, m, op, val1, val2;
arb A[400066];
int maxim( int a,int b){
if (a > b) return a;
return b;
};
void init_arb(int nod, int a, int b){
A[nod].st = a;
A[nod].dr = b;
if (a == b) {
A[nod].val = v[a];
return;
};
int mij = (a + b) / 2;
init_arb(2 * nod, a, mij);
init_arb(2 * nod + 1, mij + 1, b);
A[nod].val = maxim(A[2*nod].val, A[2*nod + 1].val);
};
void update_arb(int nod){
int mij = (A[nod].st + A[nod].dr ) / 2;
if (A[nod].st != A[nod].dr){
if (mij >= val1) update_arb(2 * nod);
else update_arb(2 * nod + 1);
A[nod].val = maxim(A[2 * nod].val, A[2 * nod + 1].val);
return;
}
A[nod].val = val2;
};
int query_arb(int nod, int a, int b){
if (a <= A[nod].st && b >= A[nod].dr)
return A[nod].val;
int mij = ( A[nod].st + A[nod].dr ) / 2;
int max1, max2;
max1 = -1;
max2 = -1;
if (a <= mij)
max1 = query_arb(2 * nod, a, mij);
if (b > mij)
max2 = query_arb(2 * nod + 1, mij + 1, b);
return maxim(max1,max2);
};
int main(){
fin>>n>>m;
for (int i = 1; i <= n; i++)
fin >> v[i];
init_arb(1,1,n);
for (int i = 1; i <= m; i++){
fin >> op >> val1 >> val2;
if (op) {
v[val1] = val2;
init_arb (1,1,n);
}
else
fout << query_arb(1, val1, val2) << '\n';
};
return 0;
};