Cod sursa(job #2609219)

Utilizator stef2003Bud Stefan stef2003 Data 2 mai 2020 12:35:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <cstdio>

using namespace std;

int v[100001], aint[400005], ql, qr;

void build(int nod, int l, int r) {
  int mij;
  if(l>r)
    return;
  if(l==r) {
    aint[nod]=v[l];
    return;
  }
  mij=(l+r)/2;
  build(2*nod,l,mij);
  build(2*nod+1,mij+1,r);
  aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}

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

int query(int nod, int l, int r) {
  int mij, rst, rdr;
  if(qr<l || ql>r || l>r)
    return -1;
  if(ql<=l && qr>=r)
    return aint[nod];
  mij=(l+r)/2;
  rst=query(2*nod,l,mij);
  rdr=query(2*nod+1,mij+1,r);
  return max(rst,rdr);
}

int main() {
  FILE *fin, *fout;
  int n, m, i, p, a, b;
  fin=fopen("arbint.in","r");
  fout=fopen("arbint.out","w");
  fscanf(fin, "%d%d",&n,&m);
  for(i=1;i<=n;i++)
    fscanf(fin, "%d",&v[i]);
  build(1,1,n);
  for(i=1;i<=m;i++) {
    fscanf(fin, "%d%d%d",&p,&a,&b);
    if(p==0) {
      ql=a;
      qr=b;
      fprintf(fout, "%d\n",query(1,1,n));
    }
    else
      update(1,1,n,a,b);
  }
  fclose( fin );
  fclose( fout );
  return 0;
}