Pagini recente » Cod sursa (job #182031) | Cod sursa (job #2928419) | Cod sursa (job #2585997) | Cod sursa (job #2571590) | Cod sursa (job #1706823)
#include <fstream>
#define InFile "arbint.in"
#define OutFile "arbint.out"
#define MAX 100001
using namespace std;
void query (int node, int left, int right);
void update (int node, int left, 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 (InFile);
ofstream fout (OutFile);
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 (int node, int left, int right)
{
if (start<=left && right<=finish)
{
if (maximum < maxArb[node])
maximum = maxArb[node];
return;
}
unsigned int mid;
mid = (left+right)/2;
if (start <= mid)
query(2*node,left,mid);
if (mid < finish)
query(2*node+1,mid+1,right);
}
void update (int node, int left, int right)
{
if (left == right)
{
maxArb[node] = val;
return;
}
unsigned int mid;
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]);
}