Cod sursa(job #2387641)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 24 martie 2019 22:39:45
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
#define DMAX 300010
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[DMAX];
int n,m;
inline int maxim(int x, int y)
{
  return   x>y ? x : y;
}


void citire();
int query(int nod,int st,int dr, int x, int y);
void Modif(int val, int poz, int st, int dr, int nod);
int main()
{citire();

    return 0;
}
void citire()
{
 int i;
 int x,y,c;
 fin>>n>>m;
 for(i=1;i<=n;i++)
    {
      fin>>x;
      Modif(x,i,1,n,1);
    }
  for(i=1;i<=m;i++)
    {
     fin>>c>>x>>y;
     if(c==1)
        Modif(y,x,1,n,1);
        else
           fout<< query(1,1,n,x,y)<<'\n';
    }
}
void Modif(int val,int poz,int st, int dr,int nod)
{
  int mj;
  if(st==dr)
        a[nod]=val;
       else
       {
        mj=(st+dr)/2;
        if(poz<=mj)
            Modif(val,poz,st,mj,2*nod);
          else
            Modif(val,poz,mj+1,dr,2*nod+1);
        a[nod]=maxim(a[nod*2],a[nod*2+1]);

       }
}
int query(int nod, int st, int dr, int x, int y)
{int mj;
 int ans1=0,ans2=0;
   if(x<=st && y>=dr)
        return a[nod];
    mj=(st+dr)/2;
    if(x<=mj)
        ans1= query(2*nod,st,mj,x,y);
    if(y>mj)
        ans2= query(2*nod+1,mj+1,dr,x,y);
    return maxim(ans1,ans2);

}