Cod sursa(job #1464987)

Utilizator TeodorescuStefanEduardTeodorescu Stefan Eduard TeodorescuStefanEduard Data 26 iulie 2015 11:36:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.41 kb
#include <bits/stdc++.h>
using namespace std; 
#define Nmax 100013
int n,i,j,k,m,azk,op,b,x,y;
int a[Nmax]; 
 
class cell
    {
 public : 
    int val,ids,idd;
    cell *l,*r;
    cell(){};
    };
  
class DynamicSegmentTree
          {     
    public: 
          cell *Root; 
              
          cell *BuildTree (int left, int right) {
                      cell *node = new cell; 
                      if (left==right) 
                         {
                         node->l = NULL;
                         node->r = NULL;
                         node->val = a[left];
                         node->idd=node->ids=left;
                         return node;
                         }
                      int middle = (left+right)>>1;
                      node->l = BuildTree(left,middle);
                      node->r = BuildTree(middle+1,right);
                      node->val = max(node->l->val,node->r->val);
                      node->ids = node->l->ids;
                      node->idd = node->r->idd;
                      return node;
                     }
                       
          void Update(cell *tree,int left, int right,int val){ 
                if (tree->ids > tree->idd || tree->idd<left || tree->ids>right) return;
                if (tree->idd == tree->ids) 
                              {
                               tree->val = val;
                               return;
                              }
                int middle=(left+right)>>1;
                Update(tree->l,left,right,val);
                Update(tree->r,left,right,val);
                tree->val = max(tree->l->val,tree->r->val);
                }
                      
          int Query (cell* tree,int left, int right){
                if (tree->ids>tree->idd || tree->idd<left || tree->ids>right) return 0;
                if (tree->idd<=right && left<=tree->ids) return tree->val;
                return max(Query(tree->l,left,right),Query(tree->r,left,right));
                }
                  
          } Tree;
           
                 
int main(void)
{ 
 ifstream cin("arbint.in");
 ofstream cout("arbint.out");
 cin>>n>>m;
 for (i=1;i<=n;++i) cin>>a[i];
 Tree.Root = Tree.BuildTree(1,n); 
 while(m--){
     cin>>op>>x>>y;
          if (op) Tree.Update(Tree.Root,x,x,y); 
       else cout<<Tree.Query (Tree.Root,x,y)<<"\n";
    } 
 return 0;
}