Pagini recente » Cod sursa (job #443019) | Cod sursa (job #2157852) | Cod sursa (job #2787780) | Cod sursa (job #1260738) | Cod sursa (job #1436141)
/**
* Worg
* Min & Max pe AIB
*/
#include <cstdio>
#define buffDIM 10000
#define DIM 100100
#define zeros(x) ((x ^ (x - 1)) & x)
using namespace std;
FILE *fin=freopen("arbint.in","r",stdin);
FILE *fout=freopen("arbint.out","w",stdout);
char buff[buffDIM];
int AIB[DIM], v[DIM];
int N, M, pos;
void read(int &x)
{
while( buff[pos] < '0' || buff[pos] > '9' )
if( ++pos == buffDIM )
{
fread(buff, 1, buffDIM, stdin); pos = 0;
}
x = 0;
while( buff[pos] >= '0' && buff[pos] <= '9' )
{
x = x * 10 + buff[pos] - '0';
if( ++pos == buffDIM )
{
fread(buff, 1, buffDIM, stdin); pos = 0;
}
}
}
inline int Query(int left, int right)
{
int ret = 0;
while(left <= right)
{
if(right - zeros(right) + 1 >= left)
{
if( v[ret] < v[ AIB[right] ] )
ret = AIB[right];
right -= zeros(right);
}
else
{
if( v[ret] < v[right] )
ret = right;
--right;
}
}
return ret;
}
inline void Update(int pos)
{
int i, val;
for(i = pos; i <= N; i += zeros(i))
{
if( AIB[i] == pos )
{
val = Query(i - zeros(i) + 1,i - 1);
if(v[val] > v[i])
AIB[i] = val;
else
AIB[i] = i;
}
else
if( v[pos] > v[ AIB[i] ] )
AIB[i] = pos;
}
}
void Set()
{
int i;
fread(buff, 1, buffDIM, stdin);
v[0] = -1;
read(N); read(M);
for(i = 1; i <= N; ++i)
{
read( v[i] );
Update(i);
}
}
void Solve()
{
int i, op, a, b;
for(i = 1; i <= M; ++i)
{
read(op); read(a); read(b);
if( op == 1 )
{
v[a] = b;
Update(a);
}
else
printf("%d\n", v[ Query(a, b) ]);
}
}
int main()
{
Set();
Solve();
return 0;
}