Cod sursa(job #1046373)

Utilizator leontinLeontin leontin Data 2 decembrie 2013 21:16:09
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>
#define N 100005
using namespace std;

int init[N],n,m,v[4*N+50],p1,p2;

void cstr(int st,int dr,int poz)
{if(st==dr)
  {init[st]=poz;
   return ;
  }
 int mijl=(st+dr)/2;
 cstr(st,mijl,poz*2);
 cstr(mijl+1,dr,poz*2+1);
}

void update(int poz,int val)
{int x=init[poz];
  v[x]=val;
      for(x/=2;x>0;x/=2)
        v[x]=max(v[2*x],v[2*x+1]);
}

int query(int st,int dr,int poz)
{   if(p2<st||p1>dr)
     return 0;
  int x;
    if(p1<=st&&dr<=p2)
        return v[poz];

    int mijl=(st+dr)/2;

    return max(query(st,mijl,2*poz),query(mijl+1,dr,2*poz+1));
}

int main()
{ifstream f("arbint.in");
 ofstream g("arbint.out");
  f>>n>>m;
  int i,o,x;
  cstr(1,n,1);

   for(i=1;i<=n;++i)
       {f>>x;update(i,x);}





    for(i=1;i<=m;++i)
        {f>>o>>p1>>p2;

            if(o==0)
                g<<query(1,n,1)<<'\n';
            else
                update(p1,p2);
        }

   f.close();
   g.close();

   return 0;
}