Pagini recente » Cod sursa (job #1037426) | Cod sursa (job #1845842) | Monitorul de evaluare | Cod sursa (job #435578) | Cod sursa (job #3349242)
#include <stdio.h>
#include <math.h>
int n, m, v[1000000], bucket[500];
int bucket_size;
FILE* fin, *fout;
void update(int a, int b) {
v[a-1] = b;
int where = (a-1) / bucket_size;
int st_bucket = where * bucket_size;
int end_bucket = (where + 1) * bucket_size - 1;
bucket[where]=0;
for(int i=st_bucket;i<=end_bucket;++i) {
if(bucket[where] < v[i])
bucket[where] = v[i];
}
}
void query(int a, int b) {
--a;
--b;
int rez = 0;
int bucket_a = a / bucket_size;
int bucket_b = b / bucket_size;
if(bucket_a == bucket_b) {
for(int i=a;i<=b;++i)
if(rez < v[i])
rez=v[i];
fprintf(fout, "%d\n", rez);
return;
}
int end_a = (bucket_a+1) * bucket_size - 1;
int st_b = bucket_b * bucket_size;
for(int i=a;i<=end_a;++i) {
if(rez < v[i])
rez=v[i];
}
for(int i=st_b;i<=b;++i) {
if(rez < v[i])
rez=v[i];
}
for(int i=bucket_a+1;i<bucket_b;++i) {
if(rez < bucket[i])
rez=bucket[i];
}
fprintf(fout, "%d\n", rez);
}
int main() {
fin = fopen("arbint.in", "r");
fscanf(fin, "%d%d", &n, &m);
bucket_size = sqrt(n);
for(int i=0;i<n;++i) {
fscanf(fin, "%d", &v[i]);
int where = i / bucket_size;
if(bucket[where] < v[i])
bucket[where] = v[i];
}
fout = fopen("arbint.out", "w");
while(m--) {
int nr, a, b;
fscanf(fin, "%d%d%d", &nr, &a, &b);
if(nr == 1)
update(a, b);
else
query(a, b);
}
fclose(fin);
fclose(fout);
return 0;
}