Cod sursa(job #2104842)

Utilizator racheriunicolaechowchow racheriunicolae Data 12 ianuarie 2018 12:37:56
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 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];//,fout<<nod<<" "<<s<<" "<<e<<"\n";
    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]);
        // fout<<nod<<" "<<s<<" "<<e<<"\n";
    }
}
int x,y;
void update(int nod,int s,int e,int x,int y)
{
    int m;
    if (s>=x && x<=e)
    {
        st[nod]=y;
        return;
    }
    m=(s+e)>>1;
    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;
    if (x<=s && e<=y)
        return st[nod];

    m=(s+e)>>1;
    if (x<=m) x1=querry(nod<<1,s,m,x,y);
    if (y>m)  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;
}