Nu exista pagina, dar poti sa o creezi ...
Cod sursa(job #2381179)
| Utilizator | Data | 16 martie 2019 10:48:02 | |
|---|---|---|---|
| Problema | Arbori de intervale | Scor | 50 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.54 kb |
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int arb[400000];
int n, a[100000], m;
int build(int poz, int s, int f){
if(s == f){
arb[poz] = a[s];
return arb[poz];
}
arb[poz] = max(build(poz * 2 + 1, s, (s+f)/2), build(poz * 2 + 2, (s+f)/2 + 1, f));
return arb[poz];
}
int detMax(int poz, int s, int f, int a, int b){
if(a == s && b == f)
return arb[poz];
int mij = (s+f) / 2;
if(a<=mij && b<=mij)
return detMax(poz * 2 + 1, s, mij, a, b);
if(a>mij && b>mij)
return detMax(poz * 2 + 2, mij + 1, f, a, b);
return max(detMax(poz * 2 + 1, s, mij, a, mij), detMax(poz * 2 + 2, mij + 1, f, mij + 1, b));
}
int changeElement(int poz, int s, int f, int a, int b){
if(s == f && s == a)
return arb[poz] = b;
if(a <= (s + f) / 2){
arb[poz] = max(changeElement(poz * 2 + 1, s, (s + f) / 2, a, b), arb[poz * 2 + 2]);
return arb[poz];
}
arb[poz] = max(arb[poz * 2 + 1], changeElement(poz * 2 + 2, (s + f) / 2 + 1, f, a, b));
return arb[poz];
}
int main()
{
ifstream f("arbint.in");
f>>n>>m;
for(int i=0; i<n; i++)
f>>a[i];
build(0, 0, n-1);
ofstream g("arbint.out");
for(int i=0; i<m; i++){
int op;
f>>op;
int a, b;
f>>a>>b;
if(op == 0){
g<<detMax(0, 0, n-1, a - 1, b - 1)<<endl;
continue;
}
changeElement(0, 0, n-1, a - 1, b);
}
return 0;
}
