Cod sursa(job #1385723)

Utilizator tdr_drtTdr Drt tdr_drt Data 12 martie 2015 11:47:57
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,k,ok,a[300005],b[100001];

void build(int nod,int x,int y){
  int mij=(x+y)/2;
  if(x==y) a[nod]=b[x];
  else{
    build(nod*2,x,mij);
    build(nod*2+1,mij+1,y);
    a[nod]=max(a[nod*2],a[nod*2+1]);
  }
}

int ask(int nod,int x,int y,int xi,int yi){
  if(x==y) return a[nod];
  int mij=(x+y)/2,max1=-9999999999;
  if(xi<=mij) max1=max(max1,ask(nod*2,x,mij,xi,yi));
  if(yi>mij)  max1=max(max1,ask(nod*2+1,mij+1,y,xi,yi));
  return max1;
}

void change(int nod,int x,int y,int poz,int val){
    if(x==y) a[nod]=val;
    else{
        int mij=(x+y)/2;
        if(poz<=mij) change(nod*2,x,mij,poz,val);
        else change(nod*2+1,mij+1,y,poz,val);
        a[nod]=max(a[nod*2],a[nod*2+1]);
    }
}

int main(){
 int x,y;
 f>>n>>k;
 for(int i=1;i<=n;i++) f>>b[i];
 build(1,1,n);
 for(int i=1;i<=k;i++){
     f>>ok>>x>>y;
     if(ok==0) g<<ask(1,1,n,x,y)<<"\n";
     else change(1,1,n,x,y);
 }
 return 0;
}