Cod sursa(job #3245526)

Utilizator cezarica23cezar tambozi cezarica23 Data 29 septembrie 2024 12:07:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 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 left, int right, int ls, int rd)
{
    if(ls<=left && rd>=right)
        return s[i];
    else
        if (ls>right || rd<left) 
        return 0;
    else
    {
        int mij=(left+right)/2;
        long long l=maxx(2*i,left,mij,ls,rd);
        long long r=maxx(2*i+1,mij+1,right,ls,rd);
        return max(l, r);
    }
}
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;
}