Cod sursa(job #2289158)

Utilizator alex_bb8Banilean Alexandru-Ioan alex_bb8 Data 24 noiembrie 2018 11:43:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int A[4*Nmax-1],v[Nmax],n,m;

void build(int l,int r,int node)
{
  if(l==r) A[node]=v[l];
  else
  {
    int m=(l+r)/2;
    build(l,m,2*node);
    build(m+1,r,2*node+1);
    A[node]=max(A[2*node],A[2*node+1]);
  }
}

int poz;

void update(int l,int r,int node)
{
 if(l==r) A[node]=v[l];
 else
 {
  int m=(l+r)/2;
  if(poz<=m) update(l,m,2*node);
  else update(m+1,r,2*node+1);
  A[node]=max(A[2*node],A[2*node+1]);
 }
}

int s,d;

int query(int l,int r,int node)
{
 if(s<=l && r<=d)
 {
  return A[node];
 }
  else
  {
   int m=(l+r)/2,mxl=INT_MIN,mxr=INT_MIN;
   if(s<=m) mxl=query(l,m,2*node);
   if(m+1<=d) mxr=query(m+1,r,2*node+1);
   return max(mxl,mxr);
  }
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
      f>>v[i];
    build(1,n,1);
    for(int i=1;i<=m;i++)
    {
     int c,x,y;
     f>>c>>x>>y;
     if(c==0)
     {
      s=x,d=y;
      g<<query(1,n,1)<<"\n";
     }
     else
     {
      v[x]=y;
      poz=x;
      update(1,n,1);
     }
    }
    return 0;
}