Pagini recente » Cod sursa (job #314137) | Cod sursa (job #218443) | Cod sursa (job #976377) | Cod sursa (job #2405193) | Cod sursa (job #1464987)
#include <bits/stdc++.h>
using namespace std;
#define Nmax 100013
int n,i,j,k,m,azk,op,b,x,y;
int a[Nmax];
class cell
{
public :
int val,ids,idd;
cell *l,*r;
cell(){};
};
class DynamicSegmentTree
{
public:
cell *Root;
cell *BuildTree (int left, int right) {
cell *node = new cell;
if (left==right)
{
node->l = NULL;
node->r = NULL;
node->val = a[left];
node->idd=node->ids=left;
return node;
}
int middle = (left+right)>>1;
node->l = BuildTree(left,middle);
node->r = BuildTree(middle+1,right);
node->val = max(node->l->val,node->r->val);
node->ids = node->l->ids;
node->idd = node->r->idd;
return node;
}
void Update(cell *tree,int left, int right,int val){
if (tree->ids > tree->idd || tree->idd<left || tree->ids>right) return;
if (tree->idd == tree->ids)
{
tree->val = val;
return;
}
int middle=(left+right)>>1;
Update(tree->l,left,right,val);
Update(tree->r,left,right,val);
tree->val = max(tree->l->val,tree->r->val);
}
int Query (cell* tree,int left, int right){
if (tree->ids>tree->idd || tree->idd<left || tree->ids>right) return 0;
if (tree->idd<=right && left<=tree->ids) return tree->val;
return max(Query(tree->l,left,right),Query(tree->r,left,right));
}
} Tree;
int main(void)
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin>>n>>m;
for (i=1;i<=n;++i) cin>>a[i];
Tree.Root = Tree.BuildTree(1,n);
while(m--){
cin>>op>>x>>y;
if (op) Tree.Update(Tree.Root,x,x,y);
else cout<<Tree.Query (Tree.Root,x,y)<<"\n";
}
return 0;
}