Pagini recente » Cod sursa (job #2027494) | Cod sursa (job #538367) | Cod sursa (job #138679) | Cod sursa (job #1669257) | Cod sursa (job #1947118)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct adat
{
int mx,a,b;
};
adat x[500005];
int a[100005];
int n;
void kiir()
{
for(int i=1;i<=30;i++)
{
if(x[i].a!=0) cout<<i<<" "<<x[i].a<<" "<<x[i].b<<" "<<x[i].mx<<"\n";
}
}
bool gen(int a,int b,int i)
{
x[i].a=a;
x[i].b=b;
if(a==b) return 0;
int f;
f=(b-a+2)/2+a-1;
gen(a,f,2*i);
gen(f+1,b,2*i+1);
}
bool akt(int i, int f, int j)
{
int a=x[j].a;
int b=x[j].b;
if(a==b)
{
x[j].mx=f;
return 0;
}
int g;
g=(b-a+2)/2+a-1;
if(i<=g) g=2*j;
else g=2*j+1;
akt(i,f,g);
x[j].mx=max(x[j*2].mx,x[j*2+1].mx);
}
int maxi(int f, int g, int j)
{
int a=x[j].a;
int b=x[j].b;
int h=(b-a+2)/2+a-1;
if(f==a && g==b) return x[j].mx;
if(f<=h && g<=h) return maxi(f,g,j*2);
else
if(f>h && g>h) return maxi(f,g,j*2+1);
else
{
return max(maxi(f,h,j*2),maxi(h+1,g,j*2+1));
}
}
int main()
{
int m;
fin>>n>>m;
gen(1,n,1);
int f,g,h;
for(int i=1;i<=n;i++)
{
fin>>f;
a[i]=f;
akt(i,f,1);
}
//kiir();
//cout<<"\n\n\n\n";
for(int i=1;i<=m;i++)
{
fin>>f>>g>>h;
if(f==1)
{
akt(g,h,1);
}
else
{
fout<<maxi(g,h,1)<<"\n";
}
//kiir();
//cout<<"\n\n\n";
}
}