Cod sursa(job #759400)
#include<fstream>
#define max(a,b) (a < b ? b : a)
#define nmax 100105
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, arbint[nmax], val , poz, M, maxi = -1;
int start, finish ; //pt interogari
void query(int nod, int st, int dr)
{
if(start <= st && dr <= finish)
{
if(maxi < arbint[nod])
maxi = arbint[nod];
return;
}
int mij = (st + dr)/2;
if(mij >= start)
query(nod+ nod, st, mij);
if(mij < finish)
query(nod + nod + 1, mij + 1, dr);
}
void update(int nod, int st, int dr)
{
if(st == dr)
{
arbint[nod] = val;
return;
}
int mij = (st + dr) /2;
if(mij >= poz)//actualizez doar in intervalele care il contin pe poz
update(nod + nod, st, mij);
else
update(nod + nod + 1, mij + 1, dr);
arbint[nod] = max(arbint[nod + nod] , arbint[nod + nod + 1]);//actualizez maximul intervalelor dupa ce am schimbat elementul de pe poz
}
void read()
{
fin >>N >>M;
for(int i = 1; i <= N;i++){
fin>> val; poz = i ;
update(1, 1, N);
}
for(int i = 1; i <= M;i++)
{
int tip ;
fin >> tip >>poz>> val;
maxi = -1;
if(tip == 1)
update(1, 1, N);
else
{
start = poz;
finish = val;
maxi = -1;
query(1, 1, N);
fout << maxi <<'\n';
}
}
}
int main()
{
read();
fin.close();
return 0;
}