Pagini recente » Cod sursa (job #913311) | Cod sursa (job #1436106) | Cod sursa (job #2999729) | Cod sursa (job #2382967) | Cod sursa (job #1812745)
#include <fstream>
#define MAX 100001
using namespace std;
void query (unsigned int node, unsigned int left, unsigned int right);
void update (unsigned int node, unsigned int left, unsigned int right);
unsigned int N, M;
unsigned int X;
unsigned int a, b;
int maxArb[4*MAX+66];
unsigned int start, finish, pos, val;
int maximum;
unsigned int i, j;
int main ()
{
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
fin >> N >> M;
for (i=1; i<=N; i++)
{
fin >> X;
pos = i;
val = X;
update(1,1,N);
}
for (i=1; i<=M; i++)
{
fin >> X >> a >> b;
if (X == 0)
{
maximum = -1;
start = a;
finish = b;
query(1,1,N);
fout << maximum << '\n';
}
else
{
pos = a;
val = b;
update(1,1,N);
}
}
fin.close();
fout.close();
return 0;
}
void query (unsigned int node, unsigned int left, unsigned int right)
{
unsigned int mid;
if (start<=left && right<=finish)
{
if (maximum < maxArb[node])
maximum = maxArb[node];
return;
}
mid = (left+right)/2;
if (start <= mid)
query(2*node,left,mid);
else
query(2*node+1,mid+1,right);
}
void update (unsigned int node, unsigned int left, unsigned int right)
{
unsigned int mid;
if (left == right)
{
maxArb[node] = val;
return;
}
mid = (left+right)/2;
if (pos <= mid)
update(2*node,left,mid);
else
update(2*node+1,mid+1,right);
maxArb[node] = max(maxArb[2*node],maxArb[2*node+1]);
}