Pagini recente » Cod sursa (job #2998914) | Cod sursa (job #1947321) | Cod sursa (job #574042) | Cod sursa (job #1377353) | Cod sursa (job #2077360)
#include <iostream>
#include <fstream>
#include <cmath>
#include <stdlib.h>
using namespace std;
int x[100001];
int batog[5000];
int impartire,nr_impartiri;
int n;
ifstream in("arbint.in");
ofstream out("arbint.out");
void calculare_max_batog(int y)
{
int lim_sup;
int lim_inf=(y-1)*impartire+1;
batog[y]=x[lim_inf];
if(n<y*impartire)lim_sup=n;
else lim_sup=y*impartire;
batog[y]=x[y*impartire];
for(int i=lim_inf+1; i<=lim_sup; ++i)if(x[i]>batog[y])batog[y]=x[i];
}
void returneaza_maxim(int a, int b)
{
int maxim=x[a];
while(a%impartire!=1&&a<=b)
{
if(x[a]>maxim)maxim=x[a];
a++;
}
while(b%impartire!=1&&a<=b)
{
if(x[b]>maxim)maxim=x[b];
b--;
}
while(a<=b)
{
if(batog[(a-1)/impartire+1]>maxim)maxim=batog[(a-1)/impartire+1];
a+=impartire;
}
// cout<<maxim<<'\n';
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=(int)sqrt(n);
if(impartire>n)impartire=n;
if(impartire<1)impartire=1;
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)
{
returneaza_maxim(arg1,arg2);
}
else
{
x[arg1]=arg2;
calculare_max_batog((arg1-1)/impartire+1);
}
}
in.close();
out.close();
return 0;
}