Nu aveti permisiuni pentru a descarca fisierul grader_test6.in
Cod sursa(job #3273669)
Utilizator | Data | 3 februarie 2025 12:48:15 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 40 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.98 kb |
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int Nmax = 100005;
int n, q;
int sir[Nmax], aint[Nmax];
void aint_build(int nod, int st, int dr){
if(st == dr){
aint[nod] = sir[st];
return;
}
int mid = (st + dr) / 2;
aint_build(2 * nod, st, mid);
aint_build(2 * nod + 1, mid + 1, dr);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
void aint_update(int nod, int st, int dr, int poz, int val){
if(st == poz && dr == poz){
aint[nod] = val;
return;
}
int mid = (st + dr) / 2;
if(poz <= mid){
aint_update(2 * nod, st, mid, poz, val);
}
else{
aint_update(2 * nod + 1, mid + 1, dr, poz, val);
}
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
int aint_query(int nod, int st, int dr, int capat_st, int capat_dr){
if(st == capat_st && dr == capat_dr){
return aint[nod];
}
int mid = (st + dr) / 2;
if(capat_dr <= mid){
return aint_query(2 * nod, st, mid, capat_st, capat_dr);
}
else if(mid < capat_st){
return aint_query(2 * nod + 1, mid + 1, dr, capat_st, capat_dr);
}
else{
return max(aint_query(2 * nod, st, mid, capat_st, mid), aint_query(2 * nod + 1, mid + 1, dr, mid + 1, capat_dr));
}
}
void citire_sir(){
fin >> n >> q;
for(int i = 1; i <= n; i++){
fin >> sir[i];
}
}
void citire_si_rezolvare_interogari(){
int tip, poz, val, capat_st, capat_dr;
for(int i = 1; i <= q; i++){
fin >> tip;
if(tip == 1){
fin >> poz >> val;
aint_update(1, 1, n, poz, val);
}
else{
fin >> capat_st >> capat_dr;
fout << aint_query(1, 1, n, capat_st, capat_dr) << '\n';
}
}
}
int main(){
citire_sir();
aint_build(1, 1, n);
citire_si_rezolvare_interogari();
return 0;
}