Pagini recente » Cod sursa (job #2539576) | Cod sursa (job #2411658) | Cod sursa (job #2165707) | Borderou de evaluare (job #2016303) | Cod sursa (job #1456389)
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926535897932384626433832795
#define inf 9223372036854775800LL
#define _64 long long
#define modulo 1e9+7
#define eps 1e-12
#define mp make_pair
#define pb push_back
#define FOR(i,a,b) for (int i =(int)(a); i<=(int)(b);++i)
#define ROF(i,a,b) for (int i =(int)(a); i>=(int)(b);--i)
int n,i,j,k,m,azk,op,b,x,y;
int a[100013];
class DynamicSegmentTree
{
private :
struct cell
{
int val;
int ids;
int idd;
cell *l;
cell *r;
};
public:
cell *Root;
void DFS(cell *tree)
{
if (tree==NULL) return;
cout<<tree->val<<" ";
DFS(tree->l);
DFS(tree->r);
}
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)/2;
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)/2;
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;
}