Pagini recente » Cod sursa (job #2980311) | Cod sursa (job #3155573) | Cod sursa (job #2318034) | Cod sursa (job #2698489) | Cod sursa (job #1420559)
// Arbori intervale - O(logN) pe operatie
#include <fstream>
#define Nmax 100099
#define oo 2000000000
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N, M, v[Nmax], MAX[4*Nmax], MIN[4*Nmax], sol, A, B, val;
void upd(const int& node, const int& st, const int& dr) {
if (st == dr){
MAX[node] = MIN[node] = val;
return;
}
int mij = (st+dr) >> 1 , s1=node<<1, s2=s1+1;
if(A <= mij)upd(s1, st, mij);
else upd(s2, mij+1, dr);
if(MAX[s1] > MAX[s2]) MAX[node] = MAX[s1];
else MAX[node] = MAX[s2];
/*
if(MIN[s1] < MIN[s2]) MIN[node] = MIN[s1];
else MIN[node] = MIN[s2];
*/
}
void query(const int& node, const int& st, const int& dr) {
if(A <= st && dr <= B) {
if(MAX[node] > sol) sol = MAX[node];
/* if(MIN[node] < solmin) solmin = min[node] */;
return;
}
int mij = (st+dr) >> 1 , s1 = node<<1, s2 = s1+1;
if(A <= mij) query(s1, st, mij);
if(mij < B) query(s2, mij+1, dr);
}
int main() {
f >> N >> M;
/* init */
for(int i = 1; i <= N; ++i) {
f>>val;
A = B = i;
upd(1, 1, N);
}
for(int i=1;i<=M;++i) {
int x, y, op;
f >> op >> x >> y;
if(op == 1) {
A = B = x;
val = y;
upd(1, 1, N);
}
else {
A = x;
B = y;
sol = 0;
query(1, 1, N);
g << sol << '\n';
}
}
f.close();g.close();
return 0;
}