Cod sursa(job #2098720)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 3 ianuarie 2018 14:11:29
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#define MAX 100001

using namespace std;

int n,m,ai[MAX],v[MAX],a,b,o;
void initializare(int poz,int st,int dr){
  if(st==dr){
    ai[poz]=v[st];
    return;
  }
  int mij=(st+dr)/2;
  initializare(poz*2,st,mij); initializare(poz*2+1,mij+1,dr);
  ai[poz]=max(ai[poz*2],ai[poz*2+1]);
}
int query(int poz,int st,int dr){
  if(dr<a||st>b)return 0;
  if(st>=a&&dr<=b)return ai[poz];
  if(st==dr)return v[poz];
  int mij=(st+dr)/2;
  //cout<<st<<" "<<dr<<" "<<max(query(poz*2,st,mij),query(poz*2+1,mij+1,dr))<<'\n';
  return max(query(poz*2,st,mij),query(poz*2+1,mij+1,dr));
}
void update(int poz,int st,int dr){
  if(st==dr){
    ai[poz]=v[st];
    return;
  }
  int mij=(st+dr)/2;
  if(a<=mij)update(poz*2,st,mij);
  else update(poz*2+1,mij+1,dr);
  ai[poz]=max(ai[poz*2],ai[poz*2+1]);
}

int main()
{
    ifstream f ("arbint.in");
    ofstream g ("arbint.out");
    f>>n>>m;
    for(int i=1;i<=n;i++)f>>v[i];
    initializare(1,1,n);
    for(int i=1;i<=m;i++){
      f>>o>>a>>b;
      if(o==0)g<<query(1,1,n)<<'\n';
      else {
        v[a]=b;
        update(1,1,n);
      }
    }
    f.close ();
    g.close ();
    return 0;
}