Nu aveti permisiuni pentru a descarca fisierul grader_test6.ok
Cod sursa(job #156633)
Utilizator | Data | 12 martie 2008 17:53:21 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.23 kb |
#include <stdio.h>
#define nm 100010
int ai[5*nm];
int n, m, i, x, y, z;
inline int MX(int a, int b) { return (a > b ? a : b); }
void upd(int node, int a, int b, int p, int x)
{
int mid = (a + b)/2;
if (a == b)
ai[node] = x;
else
if (p > mid)
{
upd(2*node+1, mid+1, b, p, x);
ai[node] = MX(ai[2*node], ai[2*node+1]);
}
else
if (p <= mid)
{
upd(2*node, a, mid, p, x);
ai[node] = MX(ai[2*node], ai[2*node+1]);
}
}
int query(int node, int a, int b, int x, int y)
{
int mid = (a + b)/2;
if (a == b)
return ai[node];
if (a == x && b == y)
return ai[node];
if (x <= mid)
{
if (y > mid)
{
return MX(query(2*node, a, mid, x, mid), query(2*node+1, mid+1, b, mid+1, y));
}
else
return query(2*node, a, mid, x, y);
}
else
return query(2*node+1, mid+1, b, x, y);
}
void read()
{
scanf("%d %d ", &n, &m);
for (i=1; i<=n; ++i)
{
scanf("%d ", &x);
upd(1, 1, n, i, x);
}
}
void solve()
{
for (i=1; i<=m; ++i)
{
scanf("%d %d %d", &x, &y, &z);
if (x == 0)
{
printf("%d\n", query(1, 1, n, y, z));
}
else
{
upd(1, 1, n, y, z);
}
}
}
void write()
{
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out","w",stdout);
read();
solve();
write();
return 0;
}