Pagini recente » Cod sursa (job #801773) | Cod sursa (job #2553254) | Cod sursa (job #2529600) | Cod sursa (job #2608318) | Cod sursa (job #2077788)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int x[100100];
int batog[400];
int impartire,n,nr_impartiri;
ifstream in("arbint.in");
ofstream out("arbint.out");
int maximum(int a,int b)
{
if(a>=b)return a;
return b;
}
int minim(int a, int b)
{
if(a<=b)return a;
return b;
}
void calculare_max_batog(int y)
{
int lim_sup=minim(y*impartire,n);
int lim_inf=(y-1)*impartire+1;
batog[y]=x[lim_inf];
for(int i=lim_inf+1; i<=lim_sup; ++i)batog[y]=maximum(batog[y],x[i]);
}
void calculare_max_int(int a,int b)
{
int maxim=x[a];
while(a%impartire!=1&&a<=b)
{
maxim=maximum(maxim,x[a++]);
}
while(b%impartire!=1&&a<=b)
{
maxim=maximum(maxim,x[b--]);
}
while(a<=b)
{
maxim=maximum(maxim,batog[(a-1)/impartire+1]);
a+=impartire;
}
out<<maxim<<'\n';
}
void generare_batog()
{
for(int i=1; i<=nr_impartiri; ++i)
{
calculare_max_batog(i);
}
}
int main()
{
int op,arg1,arg2,nrop;
in>>n>>nrop;
impartire=maximum(1,minim(n,(int)sqrt((float)n)));
nr_impartiri=n/impartire;
for(int i=1; i<=n; ++i)in>>x[i];
generare_batog();
for(int i=0; i<nrop; ++i)
{
in>>op>>arg1>>arg2;
if(op==0)
{
calculare_max_int(arg1,arg2);
}
else
{
x[arg1]=arg2;
int j=(arg1-1)/impartire;
calculare_max_batog(j);
}
}
in.close();
out.close();
return 0;
}