Pagini recente » Cod sursa (job #3203830) | Cod sursa (job #2876878) | Cod sursa (job #2698496) | Cod sursa (job #2378809) | Cod sursa (job #3145505)
#include <stdio.h>
#include <math.h>
#define NMAX 100002
#define SQMAX 317
int sq;
int v[NMAX];
int batog[SQMAX];
static inline void update(int poz, int val) {
int i;
if (batog[poz/sq]==v[poz]) {
batog[poz/sq]=0;
v[poz] = val;
for (i=(poz+sq-1)/sq*sq; i<(poz/sq)*sq; i++) {
if (batog[poz/sq]<v[i]) {
batog[poz/sq] = v[i];
}
}
} else {
if (val>batog[poz/sq]) {
batog[poz/sq] = val;
}
v[poz] = val;
}
}
int query(int st, int dr) {
int prim, ultim, rez;
prim = (st+sq-1)/sq*sq;
ultim = dr/sq*sq;
rez=0;
while (st<=dr && st<prim) {
if (rez < v[st]) {
rez=v[st];
}
st++;
}
while (dr>=st && dr>=ultim) {
if (rez < v[dr]) {
rez = v[dr];
}
dr--;
}
prim/=sq;
ultim/=sq;
while(prim<ultim) {
if (rez<batog[prim]) {
rez = batog[prim];
}
prim++;
}
return rez;
}
int main() {
FILE *fin, *fout;
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
int n, m, op, a, b, i, rez;
fscanf(fin, "%d%d", &n, &m);
sq = sqrt(n);
for (i=0; i<n; i++) {
fscanf(fin, "%d", &v[i]);
}
for (i=0; i<n; i++) {
if (v[i]>batog[i/sq]) {
batog[i/sq]=v[i];
}
}
for (i=0; i<m; i++) {
fscanf(fin, "%d%d%d", &op, &a, &b);
if (op==1) {
a--;
update(a, b);
} else {
a--;
b--;
rez = query(a, b);
fprintf(fout, "%d\n", rez);
}
}
fclose(fin);
fclose(fout);
return 0;
}