Cod sursa(job #1456389)

Utilizator azkabancont-vechi azkaban Data 30 iunie 2015 15:00:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.1 kb
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926535897932384626433832795
#define inf 9223372036854775800LL
#define _64 long long
#define modulo 1e9+7
#define eps 1e-12
#define mp make_pair
#define pb push_back
#define FOR(i,a,b) for (int i =(int)(a); i<=(int)(b);++i)
#define ROF(i,a,b) for (int i =(int)(a); i>=(int)(b);--i)
int n,i,j,k,m,azk,op,b,x,y;
int a[100013];

class DynamicSegmentTree
          {
    private : 
                   struct cell
                        {
                         int val;
                         int ids;
                         int idd;
                         cell *l;
                         cell *r;
                        };
    public: 
            cell *Root;
                
            void DFS(cell *tree) 
                  {
                  if (tree==NULL) return; 
                  cout<<tree->val<<" ";
                  DFS(tree->l);
                  DFS(tree->r);
                  }
            
            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)/2;
                      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)/2;
                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;
}