Mai intai trebuie sa te autentifici.
Cod sursa(job #1253300)
| Utilizator | Data | 1 noiembrie 2014 01:31:26 | |
|---|---|---|---|
| Problema | Arbori de intervale | Scor | 40 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 0.92 kb |
#include <fstream>
using namespace std;
int arb[50001];
void update (int i, int x, int a, int b, int index)
{
int m = (a+b)/2;
if (a!=b)
{
if (i<=m)
update (i, x, a, m, index*2);
else
update (i, x, m+1, b, index*2+1);
}
else
{
arb[index] = x;
return;
}
arb[index] = max(arb[index*2], arb[index*2+1]);
}
int query (int a, int b, int st, int dr, int index)
{
int m = (st+dr)/2;
int maxl, maxr;
if (a<=st && b>=dr)
return arb[index];
if (a<=m)
maxl = query (a, b, st, m, index*2);
if (m<b)
maxr = query (a, b, m+1, dr, index*2+1);
return (max(maxl, maxr));
}
int main()
{
int n, m, t, x, a, b;
ifstream in("arbint.in");
ofstream out("arbint.out");
in>>n>>m;
for(int i=1; i<=n; i++)
{
in>>x;
update(i, x, 1, n, 1);
}
while(m--)
{
in>>t;
if (t==0)
{
in>>a>>b;
out<<query(a, b, 1, n, 1)<<"\n";
}
else
{
in>>a>>b;
update(a, b, 1, n, 1);
}
}
return 0;
}
