Pagini recente » Cod sursa (job #719774) | Cod sursa (job #1324497) | Cod sursa (job #2099421) | Cod sursa (job #2694793) | Cod sursa (job #3139442)
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdint>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define uint32_t int
const int maxN = 100005, inf = 0x3f3f3f3f;
int n, q, v[maxN];
class ArboreDeIntervale {
private:
int type;
int aint[4 * maxN];
void join(int node) {
if(type == 1)
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
if(type == 2)
aint[node] = min(aint[2 * node], aint[2 * node + 1]);
if(type == 3)
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
public:
void build(int node = 1, int st = 1, int dr = n) {
if(st == dr)
{
aint[node] = v[st];
return;
}
int med = (st + dr) / 2;
build(2 * node, st, med);
build(2 * node + 1, med + 1, dr);
join(node);
}
void update(int poz, int node = 1, int st = 1, int dr = n) {
if(st == dr)
{
aint[node] = v[poz];
return;
}
int med = (st + dr) / 2;
if(poz <= med)
update(poz, 2 * node, st, med);
else
update(poz, 2 * node + 1, med + 1, dr);
join(node);
}
int query(int qst, int qdr, int node = 1, int st = 1, int dr = n) {
if(qst <= st && dr <= qdr)
return aint[node];
int med = (st + dr) / 2, aux = -inf;
if(qst <= med)
aux = max(aux, query(qst, qdr, 2 * node, st, med));
if(med < qdr)
aux = max(aux, query(qst, qdr, 2 * node + 1, med + 1, dr));
return aux;
}
ArboreDeIntervale(int type) {
this->type = type;
build(1, 1, n);
}
};
int main()
{
fin >> n >> q;
ArboreDeIntervale aint(1);
for(int i = 1; i <= n; i++)
fin >> v[i];
aint.build(1);
while(q--)
{
int type;
fin >> type;
if(type == 0)
{
int st, dr;
fin >> st >> dr;
fout << aint.query(st, dr) << '\n';
}
if(type == 1)
{
int poz, val;
fin >> poz >> val;
v[poz] = val;
aint.update(poz);
}
}
return 0;
}