Cod sursa(job #503429)

Utilizator APOCALYPTODragos APOCALYPTO Data 22 noiembrie 2010 21:30:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
using namespace std;
#include<iostream>
#include<fstream>
#define Nmax 100005
#define common int m=(l+r)/2,L=2*n,R=L+1
#define oo 0x3f3f3f3f
ofstream fout("arbint.out");

int a[Nmax],H[3*Nmax],full[3*Nmax],N,M;


void update(int n,int ql,int qr,int l,int r,int v)
{
    if(ql<=l && r<=qr)
    {
        H[n]=v;
        full[n]=1;
        return;

    }

    common;

    if(full[n]==1)
    {
        full[n]=0;
        full[L]=full[R]=1;
        H[L]=H[R]=H[n];


    }

    if(ql<=m) update(L,ql,qr,l,m,v);
    if(qr>=m+1) update(R,ql,qr,m+1,r,v);

    if(full[L]==1 && full[R]==1 && H[R]==H[L])

      full[n]=1;
      else full[n]=0;

    H[n]=max(H[L],H[R]);

}

int query(int n,int ql,int qr,int l, int r)
{int x,sol=-oo;

    if(full[n]==1)
    {
        return H[n];

    }

    if(ql<=l && r<=qr)
    {
        return H[n];

    }
    common;

    if(ql<=m)
    {
        x=query(L,ql,qr,l,m);
        sol=sol>x?sol:x;
    }
    if(qr>=m+1)
    {
        x=query(R,ql,qr,m+1,r);
        sol=sol>x?sol:x;

    }
    return sol;

}

inline void build(int n,int l,int r)
{
    if(l>=r) {H[n]=a[l]; full[n]=1; return;}

    common;

    build(L,l,m);
    build(R,m+1,r);

    if(H[L]==H[R] && full[L]==1 && full[R]==1 ) full[n]=1;
    else full[n]=0;

    H[n]=max(H[L],H[R]);


}

void cit()
{int i,x,xa,xb;
    ifstream fin("arbint.in");
     fin>>N>>M;

     for(i=1;i<=N;i++)
       fin>>a[i];
     build(1,1,N);
    for(i=1;i<=M;i++)
     {
         fin>>x>>xa>>xb;

         if(x==1)
           {update(1,xa,xa,1,N,xb);
           }
           else
           {
            fout<<query(1,xa,xb,1,N)<<"\n";
           }
     }
    fin.close();
}

int main()
{
    cit();

    fout.close();
    return 0;
}