Cod sursa(job #2608936)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 1 mai 2020 21:55:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int N=100005;
int aint[4*N];
int v[N];
void build(int node,int l,int r){
  if(l>r)
    return;
  if(l==r){
    aint[node]=v[l];
    return;
  }
  int mid=(l+r)/2;
  build(2*node,l,mid);
  build(2*node+1,mid+1,r);
  aint[node]=max(aint[2*node],aint[2*node+1]);
}
void update(int node,int l,int r,int poz,int val){
  if(l>r || poz>r || poz<l)
    return;
  if(l==r){
    aint[node]=val;
    return;
  }
  int mid=(l+r)/2;
  update(2*node,l,mid,poz,val);
  update(2*node+1,mid+1,r,poz,val);
  aint[node]=max(aint[2*node],aint[2*node+1]);
}
int query(int node,int l,int r,int ql,int qr){
  if(l>r || l>qr || r<ql)
    return -1;
  if(ql<=l && r<=qr)
    return aint[node];
  int mid=(l+r)/2;
  int maxi=query(2*node,l,mid,ql,qr);
  maxi=max(maxi,query(2*node+1,mid+1,r,ql,qr));
  return maxi;
}
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0),cout.tie(0);
  int n,m;
  fin>>n>>m;
  for(int i=1;i<=n;i++){
    fin>>v[i];
  }
  build(1,1,n);
  for(int i=1;i<=m;i++){
    int tip,a,b;
    fin>>tip>>a>>b;
    if(tip==0){
      fout<<query(1,1,n,a,b)<<"\n";
    }
    else{
      update(1,1,n,a,b);
    }
  }
  return 0;
}