Cod sursa(job #2640797)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 8 august 2020 12:31:22
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

class aint
{
  public:
  int maxim (int node, int st, int dr, int x, int y);
  void update(int node, int st, int dr,int poz, int val);
  void init(int node, int st, int dr);
  void citire(int n);
  private:
  int a[NMAX*4];
  int v[NMAX];
    int maxa(int c, int b)
  {
      if(c>b)
        return c;
       return b;
  }
};
 int aint::maxim(int node, int st, int dr, int x, int y)
 {
   int mj=(dr+st)/2;
   if(st==dr)
       return a[node];
   int max1=0;
   int max2=0;
   if(x<=mj)
       max1=maxim(2*node, st, mj,x,y);
   if(y>mj)
       max2=maxim(2*node+1, mj+1, dr,x,y);
   return maxa(max1, max2);
 }
 void aint::update(int node, int st, int dr,int poz, int val)
 {
   int mj=(dr+st)/2;
   if(st==dr)
       {a[node]=val;return;}

   if(poz<=mj)
       update(2*node,st,mj,poz,val);
      else
         update(2*node+1,mj+1,dr,poz,val);
   a[node]=maxa(a[2*node], a[2*node+1]);

 }
 void aint::init(int node, int st, int dr)
 {
  int mj=(dr+st)/2;
  if(st==dr)
    {a[node]=v[st];return;}
   init(2*node,st,mj);
   init(2*node+1,mj+1,dr);
   a[node]=maxa(a[2*node],a[2*node+1]);
 }
 void aint::citire(int n)
 {int i;
   for(i=1;i<=n;i++)
    {fin>>v[i];}
 }
 int n,m;
int main()
{aint x;
 fin>>n>>m;
 x.citire(n);
 x.init(1,1,n);
 for(int i=1;i<=m;i++)
    {
     int c,a,b;
     fin>>c>>a>>b;
     if(c==0)
        fout<< x.maxim(1,1,n,a,b)<<'\n';
         else
            x.update(1,1,n,a,b);

    }

    return 0;
}