Cod sursa(job #1166438)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 3 aprilie 2014 16:28:27
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
// Arbori intervale - O(logN) pe operatie

#include <fstream>
#define Nmax 100099
#define oo 2000000000
#define LS(i) (i<<1)
#define RS(i) (i<<1)+1
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int N,M,v[Nmax],Arb[4*Nmax],sol,A,B,x,y,val,op,poz;

void Update(int node,int st,int dr)
{
     if(node==poz)
     {
          Arb[node]=val;
          return;
     }

     int mij=(st+dr)>>1 , s1=node<<1, s2=s1+1;

     if(A<=mij)Update(s1,st,mij);
          else Update(s2,mij+1,dr);
     if(Arb[s1]>Arb[s2])Arb[node]=Arb[s1];
                  else  Arb[node]=Arb[s2];
}

void Query(int node,int st,int dr)
{
     if(A<=st && dr<=B)
     {
          if(Arb[node]>sol)sol=Arb[node];
          return;
     }

     int mij=(st+dr)>>1 , s1=node<<1, s2=s1+1;

     if(A<=mij)Query(s1,st,mij);
     if(mij<B) Query(s2,mij+1,dr);
}

int main()
{
     f>>N>>M;
     for(int i=1;i<=N;++i)
          f>>val , poz=i , Update(1,1,N);
     for(int i=1;i<=M;++i)
     {
          f>>op>>x>>y;
          if(op==1) poz=x , val=y , Update(1,1,N);
          else A=x , B=y, sol=0, Query(1,1,N) ,g<<sol<<'\n';
     }
     f.close();g.close();
     return 0;
}