Pagini recente » Cod sursa (job #2539376) | Cod sursa (job #644246) | Cod sursa (job #467395) | Cod sursa (job #668013) | Cod sursa (job #3002451)
///O(n log n + m log n)
#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int arbint[400005]; ///4*n
int n,pozto,x,m;
int op,a,b;
void update(int pos, int st, int dr) {
if (pozto < st || pozto > dr) { ///daca intervalul este complet exclus, iesim din functie
return;
}
if (st == dr) { ///clar daca st==dr => st==dr==pozto==st, actualizam valoarea
arbint[pos] = x;
return;
}
int mij = (st+dr)/2;
update(2*pos,st,mij); ///mergem recursiv in fiul stang
update(2*pos+1,mij+1,dr); ///mergem recursiv in fiul drept
arbint[pos] = max(arbint[2*pos],arbint[2*pos+1]); ///max o sa fie max dintre fiul stg si dr
}
int get_max(int pos, int st, int dr) {
if (st>b || dr<a) { ///daca int este complet exclus, nu il luam in calcul
return 0;
}
if (st>=a && dr<=b) { ///daca este complet inclus, il luam cu totul (nu mai mergem in jos pe arbore)
return arbint[pos];
}
int mij = (st+dr)/2;
return max(get_max(2*pos,st,mij),get_max(2*pos+1,mij+1,dr)); ///mergem recursiv pe fii
}
int main()
{ f >> n >> m;
for (int i=1;i<=n;i++) {
f >> x;
pozto = i;
update(1,1,n); ///consideram ca facem update pt el din vector (la fel ca op de tip 1)
}
for (int i=1;i<=m;i++) {
f >> op >> a >> b;
if (op==1) {
pozto = a;
x = b;
update(1,1,n);
}
else {
g << get_max(1,1,n) << '\n';
}
}
return 0;
}