Pagini recente » Monitorul de evaluare | Cod sursa (job #3325227) | Cod sursa (job #1051736) | Cod sursa (job #3319350) | Cod sursa (job #3327515)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100001;
struct SegmentTree
{
int ans;
int left, right;
SegmentTree *l, *r;
};
void updateVal(SegmentTree *crt, int &pos, int &val)
{
if (crt->left == crt->right)
{
crt->ans = val;
return;
}
int m = (crt->left + crt->right) >> 1;
if (pos <= m)
updateVal(crt->l, pos, val);
else
updateVal(crt->r, pos, val);
crt->ans = max(crt->l->ans, crt->r->ans);
}
void queryInterval(SegmentTree *crt, int &queryIntervalLeft, int &queryIntervalRight, int &maxVal)
{
if (queryIntervalLeft <= crt->left && crt->right <= queryIntervalRight)
{
maxVal = max(maxVal, crt->ans);
return;
}
int m = (crt->left + crt->right) >> 1;
if (queryIntervalLeft <= m)
queryInterval(crt->l, queryIntervalLeft, queryIntervalRight, maxVal);
if (m < queryIntervalRight)
queryInterval(crt->r, queryIntervalLeft, queryIntervalRight, maxVal);
}
void buildSegmentTree(SegmentTree *crt, int left, int right)
{
crt->left = left;
crt->right = right;
if (left == right)
{
fin >> crt->ans;
return;
}
int m = (left + right) >> 1;
crt->l = new SegmentTree();
crt->r = new SegmentTree();
buildSegmentTree(crt->l, left, m);
buildSegmentTree(crt->r, m + 1, right);
crt->ans = max(crt->l->ans, crt->r->ans);
}
void clearSegmentTree(SegmentTree *crt)
{
if (crt->left != crt->right)
{
clearSegmentTree(crt->l);
clearSegmentTree(crt->r);
}
delete crt;
}
int main()
{
SegmentTree *st = new SegmentTree();
int a, n, q, b;
fin >> n >> q;
buildSegmentTree(st, 1, n);
while (q--)
{
char x;
fin >> x >> a >> b;
if (x == '1')
updateVal(st, a, b);
else
{
int maxi = 0;
queryInterval(st, a, b, maxi);
fout << maxi << "\n";
}
}
clearSegmentTree(st);
return 0;
}