Pagini recente » Cod sursa (job #226523) | Cod sursa (job #412172) | Cod sursa (job #2975256) | Cod sursa (job #1723523) | Cod sursa (job #714962)
Cod sursa(job #714962)
//Include
#include <fstream>
#include <algorithm>
#include <utility>
using namespace std;
//Definitii
#define leftSon 2*node
#define rightSon 2*node + 1
#define left first
#define right second
//Constante
const int MAX_SIZE = (int)1e5;
//Functii
void update(int node,int left,int right);
void query(int node,int left,int right);
//Variabile
ifstream in("arbint.in");
ofstream out("arbint.out");
int nrElemente, nrOperatii;
int val, poz, maxim;
int operatie;
int tree[4*MAX_SIZE+1];
pair<int, int> interval;
//Main
int main()
{
in >> nrElemente >> nrOperatii;
for(poz=1 ; poz<=nrElemente ; ++poz)
{
in >> val;
update(1, 1, nrElemente);
}
for(int i=1 ; i<=nrOperatii ; ++i)
{
in >> operatie;
if(operatie)
{
in >> poz >> val;
update(1, 1, nrElemente);
}
else
{
in >> interval.left >> interval.right;
maxim = 0;
query(1,1,nrElemente);
out << maxim << "\n";
}
}
in.close();
out.close();
return 0;
}
void update(int node,int left,int right)
{
if(left == right)
tree[node] = val;
else
{
int mid = (left + right) / 2;
if(mid >= poz)
update(leftSon, left, mid);
else
update(rightSon, mid+1, right);
tree[node] = max(tree[rightSon], tree[leftSon]);
}
}
void query(int node, int left, int right)
{
if(interval.left <= left && interval.right >= right)
maxim = max(maxim, tree[node]);
else
{
int mid = (left + right) / 2;
if(interval.left <= mid)
query(leftSon, left, mid);
if(interval.right > mid)
query(rightSon, mid+1, right);
}
}