Cod sursa(job #2104923)

Utilizator racheriunicolaechowchow racheriunicolae Data 12 ianuarie 2018 13:40:53
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
using namespace std;
#define MAX 100050
int st[4*MAX+5],a[MAX];
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void build(int nod,int s,int e)
{
    int mid;
    if(s==e)st[nod]=a[s];
    else
    {
        mid=s+e;
        mid/=2;
        build(2*nod,s,mid);
        build(2*nod+1,mid+1,e);
        st[nod]=max(st[2*nod+1],st[2*nod]);
    }
}
int x,y;
void update(int nod,int s,int e,int x,int y)
{
    int m;
    if (s==e)
    {
        a[s]=y;
        st[nod]=y;
        return;
    }
    m=(s+e)/2;
    if (x<=m) update(nod<<1,s,m,x,y);
    else update((nod<<1)+1,m+1,e,x,y);
    st[nod]=max(st[nod<<1],st[nod<<1+1]);
}
int querry(int nod, int s,int e,int x,int y)
{
    int m,x1,x2;
    x1=x2=0;
   /// fout<<s<<" "<<e<<" "<<x<<" "<<y<<"\n";
    if (x<=s and e<=y)
        return st[nod];
    else if(e<x or s>y)return 0;
    m=(s+e)/2;
    x1=querry(nod<<1,s,m,x,y);
    x2=querry((nod<<1)+1,m+1,e,x,y);
    return max(x1,x2);
}
int n,i,q,t,z;
int main()
{
    fin>>n>>q;
    for(i=1; i<=n; i++)
    {
        fin>>a[i];
        // update(1,1,n,a[i],i);
    }

    build(1,1,n );
    for(t=1; t<=q; t++)
    {
        fin>>z>>x>>y;
        if(z==0)
        {
            fout<<querry(1,1,n,x,y)<<"\n";
        }
        else
        {
            update(1,1,n,x,y);
        }
      ///  for(i=1; i<=2*n-1; i++)fout<<st[i]<<" ";
       /// fout<<"\n";
    }
    return 0;
}