Cod sursa(job #2612538)

Utilizator AnastasiaStefanescuAnastasia Stefanescu AnastasiaStefanescu Data 9 mai 2020 10:42:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <math.h>

#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

int aint[400005];
int A[100001];

void build(int nod,int st,int dr){
  if(st>dr)
    return;
  if(st==dr){
    aint[nod]=A[st];
    return;
  }
  int mijl=(st+dr)/2;
  build(2*nod,st,mijl);
  build(2*nod+1,mijl+1,dr);
  aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}

void update(int nod,int st,int dr,int poz,int val){
  if(st>dr || poz>dr || poz<st)
    return;
  if(st==dr)
  {
    aint[nod] = val;
    return;
  }
  int mijl=(st+dr)/2;
  update(2*nod,st,mijl,poz,val);
  update(2*nod+1,mijl+1,dr,poz,val);
  aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}

int query(int nod,int st,int dr,int qst,int qdr){
  if(st>dr || st>qdr || dr<qst)
    return -1;
  if(qst<=st && dr<=qdr)
    return aint[nod];
  int mijl=(st+dr)/2;
  return max(query(2*nod,st,mijl,qst,qdr),query(2*nod+1,mijl+1,dr,qst,qdr));;
}
int n,m,x,y,c;
int main()
{
    int i;
    
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>A[i];
    
    build(1,1,n);
    
    for(i=1;i<=m;i++)
    {
        fin>>c>>x>>y;
        if(c==0)
            fout<<query(1,1,n,x,y)<<"\n";
        else
            update(1, 1, n, x, y);
    }
    

return 0;
}