Pagini recente » Cod sursa (job #2064182) | Cod sursa (job #2265183) | Cod sursa (job #2863947) | Cod sursa (job #1940512) | Cod sursa (job #2049392)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <unordered_map>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
const int NMax = 1e5 + 5;
const ll inf = 1e18 + 5;
int N,M,root;
int v[NMax],batog[NMax];
void update(int,int);
int query(int,int);
int main() {
in>>N>>M;
for (root=1;root*root <= N;++root) ;
--root;
for (int i=1;i <= N;++i) {
in>>v[i];
int idx = (i-1)/root + 1;
batog[idx] = max(batog[idx],v[i]);
}
while (M--) {
int tip,x,y;
in>>tip>>x>>y;
if (tip == 1) {
update(x,y);
}
else {
out<<query(x,y)<<'\n';
}
}
in.close();out.close();
return 0;
}
void update(int i,int val) {
int idx = (i-1)/root + 1,
st = (idx-1)*root + 1,
dr = idx*root;
batog[idx] = 0;
v[i] = val;
for (int j=st;j <= dr;++j) {
batog[idx] = max(batog[idx],v[j]);
}
}
int query(int a,int b) {
int mx = 0;
int j = a;
while ((j-1) % root != 0 && j <= b) {
mx = max(mx,v[j]);
++j;
}
while (j+root-1 <= b) {
int idx = (j-1)/root + 1;
mx = max(mx,batog[idx]);
j += root;
}
while (j <= b) {
mx = max(mx,v[j]);
++j;
}
return mx;
}