Pagini recente » Cod sursa (job #2310204) | Cod sursa (job #356758) | Cod sursa (job #2650778) | Cod sursa (job #3198062) | Cod sursa (job #2690619)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NMAX = 100000;
class InParser {
private:
static const int buff_size = 1 << 16;
char buffer[buff_size];
int buff_pointer;
FILE *infile;
char get_char() {
if(buff_pointer == buff_size) {
buff_pointer = 0;
fread(buffer, sizeof(buffer[0]), buff_size, infile);
}
return buffer[buff_pointer++];
}
public:
InParser(const char * file_name) {
infile = fopen(file_name, "r");
buff_pointer = buff_size;
}
InParser & operator >> (int &nr) {
char ch;
nr = 0;
do {
ch = get_char();
} while(ch < '0' || ch > '9');
while(ch >= '0' && ch <= '9') {
nr = nr * 10 + ch - '0';
ch = get_char();
}
return *this;
}
void close() {
fclose(infile);
}
};
class OutParser {
private:
static const int buff_size = 1 << 16;
char buffer[buff_size];
int buff_pointer;
char *ofile_name;
void put_char(char ch) {
if(buff_pointer == buff_size) {
FILE *outfile = fopen(ofile_name, "w");
fwrite(buffer, sizeof(buffer[0]), buff_size, outfile);
fclose(outfile);
buff_pointer = 0;
}
buffer[buff_pointer++] = ch;
}
public:
OutParser(const char * file_name) {
int file_length = strlen(file_name);
ofile_name = new char[file_length];
for(int i = 0; i < file_length; i++)
ofile_name[i] = file_name[i];
buff_pointer = buff_size;
}
OutParser & operator << (int nr) {
int cf[10], nr_cf = 0;
while(nr) {
cf[nr_cf++] = nr % 10;
nr /= 10;
}
for(int i = nr_cf - 1; i >= 0; i--)
put_char(cf[i] + '0');
return *this;
}
OutParser & operator << (char ch) {
put_char(ch);
return *this;
}
void close() {
FILE *outfile = fopen(ofile_name, "w");
fwrite(buffer, 1, buff_pointer, outfile);
fclose(outfile);
}
};
int n, m;
int aint[2 * NMAX + 5];
void build() {
for(int i = n - 1; i; i--)
aint[i] = max(aint[i << 1], aint[(i << 1) + 1]);
}
void update(int poz, int val) {
aint[poz += n - 1] = val;
for(poz >>= 1; poz; poz >>= 1)
aint[poz] = max(aint[poz << 1], aint[(poz << 1) + 1]);
}
int query(int st, int dr) {
int ans = -1;
for(st += n - 1, dr += n - 1; st <= dr; st >>= 1, dr >>= 1) {
if(st & 1)
ans = max(ans, aint[st++]);
if(!(dr & 1))
ans = max(ans, aint[dr--]);
}
return ans;
}
int main() {
InParser in("arbint.in");
OutParser out("arbint.out");
in >> n >> m;
for(int i = 0; i < n; i++)
in >> aint[n + i];
build();
for(int i = 1; i <= m; i++) {
int tip, a, b;
in >> tip >> a >> b;
if(!tip)
out << query(a, b) << '\n';
else
update(a, b);
}
in.close();
out.close();
return 0;
}