Mai intai trebuie sa te autentifici.
Cod sursa(job #2817358)
Utilizator | Data | 13 decembrie 2021 16:04:59 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.08 kb |
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int nmax= 100000;
const int pmax= 262144;
int arb[pmax];
int p= 1;
void init( int x ) {
if ( x<p ) {
init (x*2), init(x*2+1);
arb[x]= max(arb[x*2], arb[x*2+1]);
}
}
void change( int a, int b ) {
arb[p+a-1]= b;
for ( int i= (p+a-1)/2; i>0; i>>= 1 ) {
arb[i]= max(arb[i*2], arb[i*2+1]);
}
}
int solve( int a, int b, int k, int x, int y ) {
if ( a<=x && y<=b ) {
return arb[k];
} else if ( y<a || x>b ) {
return 0;
} else {
return max(solve(a, b, k*2, x, (x+y)/2), solve(a, b, k*2+1, (x+y)/2+1, y));
}
}
int main( ) {
int n, m;
fin>>n>>m;
for ( ; p<n; p<<= 1 ) ;
for ( int i= 0; i<n; ++i ) {
fin>>arb[p+i];
}
init(1);
for ( int i= 0, x, a, b; i<m; ++i ) {
fin>>x>>a>>b;
if ( x==1 ) {
change(a, b);
} else {
fout<<solve(a, b, 1, 1, p)<<"\n";
}
}
return 0;
}