Cod sursa(job #759159)

Utilizator iris88Nagy Aliz iris88 Data 16 iunie 2012 22:49:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <limits.h>

#define NMAX 100010
using namespace std;
typedef struct node{
  int a,b;
  int val;
  node *left,*right;
}node;

void insert(int x, int val,node *T)
{
  if (x<=T->a && x>= T->b)
  {    
      T->val = val;
      return;
  }
  int mij = (T->a+T->b)/2;
  if (x<=mij)
    insert(x,val,T->left);
  if (x>mij)
    insert(x,val,T->right);
  int mx = T->left->val;
  if (mx>T->right->val)
    T->val = mx;
  else
    T->val = T->right->val;
}
int getmax(int a, int b,node *T)
{
  if (a<=T->a && b>=T->b)
  {
    return T->val;
  }
  int m1=INT_MIN;
  int m2=INT_MIN;
  int mij = (T->a+T->b)/2;
  if(a<=mij)
    m1 = getmax(a,b,T->left);
  if (b>mij)
    m2 = getmax(a,b,T->right);
  if (m1>m2) return m1;
  return m2;
}
node* buildtree(int a,int b,int *val)
{
  if (a==b)
  {
    node *x= new node;
    x->a = a;
    x->b = b;
    x->val = val[a];
    x->left = NULL;
    x->right = NULL;
    return x;
  }
  else{
    int mij = (a+b)/2;
    node *x = new node;
    x->a =a;
    x->b =b;
    x->left = buildtree(a,mij,val);
    x->right = buildtree(mij+1,b, val);
    int max = x->left->val;
    if (x->right->val>max)
      max = x->right->val;
    x->val = max;
    return x;
  }
  return NULL;
}
int vect[NMAX];
node *T;
int main()
{
  ifstream f("arbint.in",ios::in);
  ofstream g("arbint.out",ios::out);
  int n,m;
  f>>n>>m;
  for (int i=0;i<n;i++)
    f>>vect[i];
  T = buildtree(0,n-1,vect);
  for (int j=0;j<m;j++)
  {
    int t,a,b,mx;
    f>>t>>a>>b;
    if (t==0){
      mx = getmax(a-1,b-1,T);
      g<<mx<<"\n";
    }
    else{
      vect[a-1] = b;
      insert(a-1,b,T);
    }
  }
  f.close();
  g.close();
}