Cod sursa(job #2308716)

Utilizator stan_flaviusStan Flavius Stefan stan_flavius Data 27 decembrie 2018 17:20:47
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <iostream>
#define nmax 100001

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int v[nmax],n,m;
int tree[nmax*nmax];

void BuildTree(int pos,int val,int node,int left,int right)
{ if(left==right) {tree[node]=val; return;}
  int mid=(left+right)/2;
  if(pos<=mid) BuildTree(pos,val,node*2,left,mid);
  else BuildTree(pos,val,node*2+1,mid+1,right);
  tree[node]=max(tree[node*2],tree[node*2+1]);
}

void ChangeVal(int pos,int val,int node,int left,int right)
{ if(left==pos && right==pos) {tree[node]=val; return; }
  int mid=(left+right)/2;
  if(pos<=mid) BuildTree(pos,val,node*2,left,mid);
  else BuildTree(pos,val,node*2+1,mid+1,right);
  tree[node]=max(tree[node*2],tree[node*2+1]);
}

void Max(int node,int left,int right,int in,int fin,int &mx)
{ if(in<=left && right<=fin)
     { if(tree[node]>mx) mx=tree[node];
       return;
     }
  int mid=(left+right)/2;
  if(in<=mid) Max(node*2,left,mid,in,fin,mx);
  if(mid<fin) Max(node*2+1,mid+1,right,in,fin,mx);
}

int main()
{ int i,q,a,b;
  fin>>n>>m;
  for(i=1; i<=n; i++)
      { fin>>v[i];
        BuildTree(i,v[i],1,1,n);
      }

  for(i=1; i<=m; i++)
     { fin>>q>>a>>b;
       if(q==0)
          { int mx=0;
            Max(1,1,n,a,b,mx);
            fout<<mx<<"\n";
          }
       else  ChangeVal(a,b,1,1,n);

     }

    return 0;
}