Mai intai trebuie sa te autentifici.
Cod sursa(job #1789519)
Utilizator | Data | 27 octombrie 2016 08:26:40 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.56 kb |
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define INF numeric_limits<int>::max()
#define int64 long long
#define lsb(x) (-x)&(x)
using namespace std;
class SegmentTree{
vector<int> tree;
int n;
public:
SegmentTree(int dim)
{
n=dim;
tree=vector<int> (4*dim+1);
}
void update(int pos,int val,int x,int left,int right)
{
if(left==right)
tree[x]=val;
else{
int mid=(left+right)/2;
if(pos<=mid)
update(val,pos,2*x,left,mid);
else
update(val,pos,2*x+1,mid+1,right);
tree[x]=max(tree[2*x],tree[2*x+1]);
}
}
int get_max(int a,int b,int x,int left,int right)
{
if(a>=left && right<=b)
return tree[x];
else{
int mid=(left+right)/2,mx=-INF;
if(a<=mid)
mx=max(mx,get_max(a,b,2*x,left,mid));
if(b>mid)
mx=max(mx,get_max(a,b,2*x+1,mid+1,right));
return mx;
}
}
};
int main()
{
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m;
in>>n>>m;
SegmentTree T(n);
for(int i=1;i<=n;i++)
{
int x;
in>>x;
T.update(i,x,1,1,n);
}
for(;m;m--)
{
int t;
in>>t;
if(t==1)
{
int pos,val;
in>>pos>>val;
T.update(pos,val,1,1,n);
}
else{
int a,b;
in>>a>>b;
out<<T.get_max(a,b,1,1,n)<<'\n';
}
}
return 0;
}