Cod sursa(job #1436840)

Utilizator Alex1199Alex Bercea Alex1199 Data 16 mai 2015 15:28:14
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <iostream>
#define MX -1;
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int nx=100000;
int a[nx], n, m;
int t[4*nx];
void build(int v, int vl, int vr, int a[]){
       if(vl==vr){
         t[v]=a[vl];
         return ;
       }
       int vm=vl+(vr-vl)/2;
       build(2*v+1, vl, vm, a);
       build(2*v+2, vm+1, vr, a);
       t[v]=max(t[2*v+1],t[2*v+2]);
}
int rmq(int v, int vl, int vr, int l, int r){
    if(r<vl||l>vr)
        return MX;
    if(vl>=l && vr<=r)
        return t[v];
    int vm=vl+(vr-vl)/2;
    int ql=rmq(2*v+1, vl, vm, l, r);
    int qr=rmq(2*v+2, vm+1, vr, l, r);
    return max(ql,qr);
}
void add(int v, int vl, int vr, int pos, int val){
    if(pos<vl||pos>vr)
      return;
    if(vl>=pos && vr<=pos)
      t[v]=val;
    else{
      int vm=vl+(vr-vl)/2;
      add(2*v+1, vl, vm, pos, val);
      add(2*v+2, vm+1, vr, pos, val);
      t[v]=max(t[2*v+1],t[2*v+2]);
    }
}
int main()
{
    f>>n>>m;
    for(int i=0;i<n;i++) f>>a[i];
    build(0,0,n-1,a);
    while (m){
          int w, u, v;
          f>>w>>u>>v;
          if (!w) g<<rmq(0,0,n-1,u-1,v-1)<<endl;
          else add(0,0,n-1,u-1,v-1); m--;
    }
    return 0;
}