Cod sursa(job #751621)

Utilizator memaxMaxim Smith memax Data 26 mai 2012 14:37:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

#define max(a,b) ((a>b)?a:b);

int main(){
    const int inf=1<<30;
    ifstream cinr ("arbint.in");
    ofstream cour ("arbint.out");
    int n1,dir,n,m,a,b,r;
    cinr >> n1;
    cinr >> m;
    n=1<<int(log(n1-1)/log(2)+1);
    vector<int> v(2*n,-inf);
    for(int j=n; j<n+n1; j++){ cinr >> v[j]; }
    for(int j=n-1; j>0; j--) { v[j]=max(v[j*2], v[j*2+1])}
    for(int j=1; j<=m; j++){
            cinr >> dir;
            if(dir==0){
                       r=-inf;
                       cinr >> a; a+=n-1;
                       cinr >> b; b+=n-1;
                       while(b>=a){
                                   if(a%2==1){ r=max(r,v[a]); }
                                   if(b%2==0){ r=max(r,v[b]); }
                                   a=(a+1)/2;
                                   b=(b-1)/2;
                                   }
                       cour << r << "\n";
                       }
            else       {
                       cinr >> a; a+=n-1;
                       cinr >> b;
                       v[a]=b; a/=2;
                       while(a>0){
                                  v[a]=max(v[2*a], v[2*a+1]);
                                  a/=2;     
                                  }
                       }
            }
    //for(int j=0; j<2*n; j++){ cout << v[j] << " "; }
    cinr.close(); cour.close();
    //cin.ignore(2);
    return 0;
    }