Pagini recente » Cod sursa (job #1897068) | Cod sursa (job #2078698) | Cod sursa (job #976945) | Cod sursa (job #1744568) | Cod sursa (job #1180871)
#include <cstdio>
#define lsb(x) (x&(-x))
using namespace std;
int i, n, m, x, y, q, v[100005], a[100005];
inline int minn (int x, int y)
{
if(x>y) return y;
return x;
}
inline int maxx (int x, int y)
{
if(x>y) return x;
return y;
}
int query(int x, int y)
{
int i=-1, c=x, b=y;
if(x>y) return i;
while(b!=c)
{
if(b-lsb(b)>=c)
{
i=maxx(i, a[b]);
b-=lsb(b);
}
else
{
i=maxx(i, v[b]);
b--;
}
}
i=maxx(i, v[c]);
return i;
}
void update(int p, int x)
{
int y;
int i=v[p];
v[p]=x;
while(p<=n)
{
if(a[p]==i)
{
y=query(p-lsb(p)+1, p-1);
a[p]=maxx(v[p], y);
}
else
{
a[p]=maxx(a[p], x);
}
p+=lsb(p);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n,&m);
for(i=1;i<=n;i++)
{
scanf("%d", &v[i]);
update(i, v[i]);
}
for(i=1;i<=m;i++)
{
if(i==1184)
i=i;
scanf("%d%d%d", &q, &x, &y);
if(q==0)
printf("%d\n", query(x, y));
else if(v[x]!=y)
update(x, y);
}
return 0;
}