Cod sursa(job #2416720)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 27 aprilie 2019 22:31:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
#define NMAX  100009
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
long long int n,m,i,c,x,y;
long long int v[NMAX];
long long int a[4*NMAX];


long long int query(long long int node,long long int x,long long  int y,long long int st,long long  int dr);
void build( int node, int st,int  dr);
void update(long long int node,long long int x,long long int y,long long int st,long long  int dr,long long  int val);

int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
    fin>>v[i];
build(1,1,n);
for(i=1;i<=m;i++)
    {
    fin>>c>>x>>y;
    if(!c)
        fout<<query(1,x,y,1,n)<<'\n';
    else
    {
     update(1,x,x,1,n,y);
    }
    }
    return 0;
}
void build( int node,int st,int dr)
{long long mj=(st+dr)/2;
  if(st==dr)
    {
     a[node]=v[st];
     return ;
    }
   build(2*node,st,mj);
   build(2*node+1,mj+1,dr);
   a[node]=max(a[2*node],a[2*node+1]);

}
void update(long long int node,long long int x,long long int y,long long int st,long long  int dr,long long  int val)
{
 long long mj=(dr +st)/2;
 if(x<=st && dr<=y )
    {
     ///full range
     a[node]=val;
     return;
    }
 if(x<=mj)
        update(2*node,x,y,st,mj,val);
   if(y>mj)
        update(2*node+1,x,y,mj+1,dr,val);
   a[node]=max(a[2*node],a[2*node+1]);
}
long long int query(long long int node,long long int x,long long  int y,long long int st,long long  int dr)
{long long int mj=(st+dr)/2,ans1=0,ans2=0;
  if(x<=st && dr<=y)
        return a[node];
    if(x<=mj)
        ans1=query(2*node,x,y,st,mj);
    if(y>mj)
        ans2=query(2*node+1,x,y,mj+1,dr);
    return max(ans1,ans2);
}