Mai intai trebuie sa te autentifici.
Cod sursa(job #2683516)
Utilizator | Data | 11 decembrie 2020 16:00:26 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.58 kb |
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
const int NMAX = 100000 + 5; //10^5
const int INF = 1e9;
const double eps = 1e-9;
#define fileI freopen(".in","r",stdin);
#define fileO freopen(".out","w",stdout);
#define IO(name) \
freopen(name".in","r",stdin); \
freopen(name".out","w",stdout);
int v[NMAX];
int arbint[4*NMAX];
void update(int node, int l, int r, int pos, int value){
if(l == r){
arbint[node] = value;
return;
}
int mid = (r - l)/2 + l; //(r+l)/2
if(pos <= mid)
update((node<<1), l, mid, pos, value);
else
update((node<<1)+1, mid+1, r, pos, value);
//default operation = max
arbint[node] = max(arbint[node<<1],arbint[(node<<1)+1]);
}
//value of arbint on [a,b] interval
int query(int node, int l, int r, int a, int b){
if(a<= l && r<=b)
return arbint[node];
int mid = (r - l)/2 + l; //(r+l)/2
//default operation = max
int maxim = -1;
if(a <= mid)
maxim = max(maxim, query(node<<1, l, mid, a, b));
if(mid < b)
maxim = max(maxim, query((node<<1)+1, mid+1, r, a, b));
return maxim;
}
void solve();
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
t = 1;
//scanf("%d",&t);
for(;t;t--){
solve();
}
return 0;
}
void solve(){
IO("arbint");
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&v[i]);
update(1,1,n,i,v[i]);
}
int q,a,b;
for(int i=1;i<=m;++i){
scanf("%d%d%d",&q,&a,&b);
if(q==0)
printf("%d\n",query(1,1,n,a,b));
else
update(1,1,n,a,b);
}
}