Cod sursa(job #3245520)

Utilizator MedenMeden Meden Meden Data 29 septembrie 2024 11:56:55
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
using namespace std;
int v[100001];
int s[400001];
int n,i,m,a,b,c;

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

void maketree(int i, int p, int q)
{
    if(p==q)
    {
        s[i]=v[p];
    }
    else
    {
        int m=(p+q)/2;
        maketree(i*2,p,m);
        maketree(i*2+1,m+1,q);
        s[i]=max(s[2*i],s[2*i+1]);
    }
}
int maxx(int i,int p,int q,int ls, int rd)
{
       if(ls<=p && q<=rd){
           return s[i];
       }else if(ls>q || rd<p) return 0;
       else{
           int mij=(p+q)/2;
           int a=maxx(i*2,p,mij,ls,rd);
           int b=maxx(i*2+1,mij+1,q,ls,rd);
           return max(a,b);
       }
       //return 0;
}
void update(int i, int p, int q, int a)
{
    if(p==q)
        s[i]=v[p];
    else
    {
        int m=(p+q)/2;
        if(a<=m)
            update(2*i,p,m,a);
        else update(2*i+1,m+1,q,a);
        s[i]=max(s[2*i],s[2*i+1]);
    }
}
int main()
{ 
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>v[i];
    maketree(1,1,n);
  for(i=1;i<=m;i++)
  {
      fin>>c>>a>>b;
      if(c==0)
        fout<<maxx(1,1,n,a,b)<<endl;
      else
      {
          v[a]=b;
          update(1,1,n,a);
      }
  }
    return 0;
}