Pagini recente » Cod sursa (job #33432) | Cod sursa (job #1719333) | Cod sursa (job #1851848) | Cod sursa (job #2617697) | Cod sursa (job #2083196)
#include <iostream>
#include <fstream>
using namespace std;
#define oo 0x3f3f3f3f
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N = 1e5 + 1; /// Nr maxim de elemente din arbore
int n; /// nr de elemente din vct
int arb[ 2 * N + 1 ];
int op; // nr de operatii de efectuat
void construieste()
{
for( int i = n - 1; i > 0; --i )
arb[ i ] = max( arb[ i << 1 ], arb[ (i << 1) | 1 ] );
}
void actualizeaza_pozitia( int poz, int val )
{
poz = poz + n;
arb[ poz ] = val;
while( poz > 1 ) /// Actualizez in sus toate intervalele
{
arb[ poz >> 1 ] = max( arb[ poz ], arb[ poz ^ 1] );
poz = poz >> 1;
}
}
int interogheaza( int st, int dr )
{
int minim=0;
st += n;
dr += n; /// Ma duc in zona unde am memorat valorile
while( st < dr )
{
if( (st & 1) != 0 ) ///suntem la pozitie impara
minim = max( arb[ st++ ], minim );
if( (dr & 1) != 0 ) /// suntem la pozitie impara
minim = max( arb[ --dr ], minim );
st >>= 1;
dr >>= 1;
}
return minim;
}
void afiseaza_arborele()
{
for( int i = 1; i <= 2*n; ++i )
g << arb[ i ] << " ";
g << endl << endl;
}
int main()
{
int i, tip, x, y;
f >> n;
f >> op;
for( i = 0; i < n; ++i )
f >> arb[ n + i ];
//g << "Dupa citire: " << endl;
//afiseaza_arborele();
construieste();
//g << endl << "Dupa constructie:" << endl;
//afiseaza_arborele();
//g << endl;
while( op > 0 )
{
f >> tip >> x >> y;
if( tip == 0 ) /// interogare: cel mai mic elem din vct, cu indicii in [x, y]
g << interogheaza( x - 1, y ) << '\n';
else
actualizeaza_pozitia( x - 1, y);
--op;
}
return 0;
}