Pagini recente » Cod sursa (job #1270279) | Cod sursa (job #506715) | Cod sursa (job #490208) | Cod sursa (job #156034) | Cod sursa (job #491445)
Cod sursa(job #491445)
// @author: Mircea Dima
#include <cstdio>
#include <cstring>
#include <algorithm>
#define bit(i) (i & -i)
using namespace std;
#define dim 8192
char ax[dim];
int pz;
inline void cit (int &x)
{
x = 0;
while (ax[pz] < '0' || ax[pz] > '9')
if (++pz == dim)
fread (ax, 1, dim, stdin), pz = 0;
while (ax[pz] >= '0' && ax[pz] <= '9')
{
x = x * 10 + ax[pz] - '0';
if (++pz == dim)
fread (ax, 1, dim, stdin), pz = 0;
}
}
const int N = 100007;
int aib[N];
int a[N];
bool updated[N];
int n, m;
int query (int, int );
int query2 (int, int );
inline void lazyUpdate (int p)
{
int x = query2 (p - bit (p) + 1, p - 1);
aib[p] = a[p] > a[x] ? p : x;
updated[p] = 1;
}
inline int query (int l, int r)
{
int i;
int ret = 0;
for (i = r; i >= l; )
{
if (i - bit (i) + 1 >= l)
{
if (a[ aib[i] ] > a[ret])
ret = aib[i];
i -= bit (i);
}
else
ret = a[i] > a[ret] ? i : ret,
--i;
}
return ret;
}
inline int query2 (int l, int r)
{
int i;
int ret = 0;
for (i = r; i >= l; )
{
if (updated[i] == 0)
lazyUpdate (i);
if (i - bit (i) + 1 >= l)
{
if (a[ aib[i] ] > a[ret])
ret = aib[i];
i -= bit (i);
}
else
ret = a[i] > a[ret] ? i : ret,
--i;
}
return ret;
}
inline void update2 (int p, int v)
{
int poz = p;
a[p] = v;
if (v > a[ aib[p] ])
aib[p] = poz;
else
if (aib[p] == poz)
updated[p] = 0;
//lazyUpdate (p);
//else
// if (v > a[ aib[p] ])
// aib[p] = poz;
for (p += bit (p); p <= n; p += bit (p))
if (v > a[ aib[p] ])
aib[p] = poz;
else
if (aib[p] == poz)
updated[p] = 0;
//else
// if (v > a[ aib[p] ])
// aib[p] = poz;
}
inline void update (int p, int v)
{
a[p] = v;
int i;
for (i = p; i <= n; i += bit (i))
lazyUpdate (i);
//aib[i] = max (a[i], query (i - bit (i) + 1, i - 1));
}
inline void build (int p, int v)
{
a[p] = v;
int i;
lazyUpdate (p);
//aib[p] = max (a[p], query (p - bit (p) + 1, p - 1));
// p += bit (p);
//if (p <= n)
// aib[p] = max (aib[p], a[p]);
}
int main ()
{
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
//scanf ("%d %d\n", &n, &m);
cit (n); cit (m);
//n = 100000;
//m = 100000;
int i;
for (i = 1; i <= n; ++i)
updated[i] = 1;
for (i = 1; i <= n; ++i)
{
//scanf ("%d ", &a[i]);
cit (a[i]);
build (i, a[i]);
//update2 (i, a[i]);
}
int t, p, q;
while (m--)
{
cit (t); cit (p); cit (q);
//scanf ("%d %d %d\n", &t, &p, &q);
if (t == 0)
printf ("%d\n", a[query2 (p, q)]);
else
// build (p, q);
update2 (p, q);
}
return 0;
}