Cod sursa(job #503186)

Utilizator APOCALYPTODragos APOCALYPTO Data 21 noiembrie 2010 22:30:57
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<cstdlib>
#define oo 0x3f3f3f3f
int H[300000],a[100005],full[300000],N,M;
#define common int m=(l+r)/2,L=n*2,R=L+1

ofstream fout("arbint.out");

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

    }
    int mij=(l+r)/2;
    int L=2*n;
    int R=L+1;

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

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

     if(full[L] && full[R] && H[L]==H[R]) 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;
     if(full[n])
      return H[n];
     if(ql<=l && r<=qr)
      return H[n];
     int mij=(l+r)/2;
     int L=n*2;
     int R=L+1;
     int sol=-oo;

     if(ql<=mij)
     {
         x=query(L,ql,qr,l,mij);
         sol=sol>x?sol:x;

     }
    if(qr>=mij+1)
    {
        x=query(R,ql,qr,mij+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;}

     int m=(l+r)/2;
     int L=n*2;
     int R=L+1;
     build(L,l,m);
     build(R,m+1,r);

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

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


}

void cit()
{int x,i,xa,xb;
    ifstream fin("arbint.in");
     fin>>N>>M;
     for(i=1;i<=N;i++)
        fin>>a[i];
      build(1,1,N);
      int k=0;
      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;
}