Pagini recente » Cod sursa (job #2614519) | Cod sursa (job #303401) | Cod sursa (job #308926) | Cod sursa (job #997715) | Cod sursa (job #296014)
Cod sursa(job #296014)
#include <cstdio>
#include <algorithm>
#define MaxN 101000
#define BUCKET 256
#define Dim (1<<13)
#define bucket(x) ((x)/BUCKET)
#define first(x) ((x)*BUCKET)
using namespace std;
unsigned n, m, poz;
unsigned val[MaxN], maxBuc[MaxN/BUCKET];
char s[100], *p;
inline void update(unsigned k, unsigned x){
unsigned b = bucket(k);
if (val[k]==maxBuc[b])
{
maxBuc[b] = val[k] = 0;
for (unsigned i=first(b); i<first(b+1); i++)
if (val[i] > maxBuc[b]) maxBuc[b] = val[i];
}
val[k] = x;
if (x>maxBuc[b]) maxBuc[b] = x;
}
inline void query(unsigned st, unsigned fn){
unsigned b1 = bucket(st), b2 = bucket(fn);
unsigned sol = 0;
for (unsigned i=b1+1; i<b2; i++)
if (maxBuc[i] > sol) sol = maxBuc[i];
if (sol < maxBuc[b1])
for (unsigned i=st; i<first(b1+1) && i<=fn; i++)
if (val[i] > sol) sol = val[i];
if (sol < maxBuc[b2])
for (unsigned i=max(first(b2), st); i<=fn; i++)
if (val[i] > sol) sol = val[i];
printf("%d\n", sol);
}
inline int get()
{
int n;
for (; *p == ' '; p++);
for (n = 0; *p >= '0' && *p <= '9'; p++)
n = n * 10 + *p - '0';
for (; *p == ' '; p++);
return n;
}
int main(){
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
//scanf("%d%d", &n, &m);
gets(s); p = s;
n = get();
m = get();
gets(s); p = s;
for (unsigned i=0; i<n; i++)
{
val[i] = get();
if (val[i] > maxBuc[bucket(i)]) maxBuc[bucket(i)] = val[i];
}
while (m--)
{
unsigned op, a, b;
gets(s); p = s;
op = get(); a = get(); b = get();
//scanf("%d%d%d", &op, &a, &b);
if (op==1) update(a-1, b);
else query(a-1, b-1);
}
}