Pagini recente » Cod sursa (job #1420744) | Cod sursa (job #2023369) | Cod sursa (job #542287) | Cod sursa (job #599769) | Cod sursa (job #160828)
Cod sursa(job #160828)
//Arbori de intervale
#include <stdio.h>
#define INPUT "arbint.in"
#define OUTPUT "arbint.out"
#define NMAX 100000
int N, M;
int arbmax[NMAX*3];
int val, pos;
int start, fin, maxim;
inline int max(int a, int b)
{
if(a > b) return a;
return b;
}
void update(int nod, int st, int dr)
{
if(st == dr)
{
arbmax[nod] = val;
return;
}
int mij = (st+dr)/2;
if(pos<=mij) update(nod<<1, st, mij);
else update((nod<<1)+1, mij+1, dr);
arbmax[nod] = max(arbmax[nod<<1], arbmax[(nod<<1)+1]);
}
void query(int nod, int st, int dr)
{
if(start <= st && dr <= fin)
{
maxim = max(maxim, arbmax[nod]);
return;
}
int mij = (st+dr)/2;
if(start<=mij) query(nod<<1, st, mij);
if(fin>mij) query((nod<<1)+1, mij+1, dr);
}
int main()
{
freopen(INPUT, "r", stdin);
freopen(OUTPUT, "w", stdout);
scanf("%d %d", &N, &M);
int i;
for(i = 1; i <= N; ++i)
{
scanf("%d", &val);
pos = i;
update(1, 1, N);
}
for(i = 1; i <= M; ++i)
{
int tip, x, y;
scanf("%d %d %d", &tip, &x, &y);
if(tip == 0)
{
start = x; fin = y; maxim = -1;
query(1, 1, N);
printf("%d\n", maxim);
}
else
{
pos = x; val = y;
update(1, 1, N);
}
}
return 0;
}