Cod sursa(job #779726)

Utilizator danielionutCojocaru ionut daniel danielionut Data 18 august 2012 17:07:57
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int maxTree[262144],maxim,a,b,value,position;
void update(int root,int left,int right)
{
if(left==right)
{
maxTree[root]=value;
}
else
{
int middle=left+(right-left)/2;
if(position<=middle) update(2*root,left,middle);
else update(2*root+1,middle+1,right);
maxTree[root]=max(maxTree[2*root],maxTree[2*root+1]);
}
}
void query(int root,int left,int right)
{
if(a<=left&&right<=b)
{
maxim=max(maxTree[root],maxim);
}
else
{
int middle=left+(right-left)/2;
if(a<=middle) query(2*root,left,middle);
if(middle<b) query(2*root+1,middle+1,right);
}
}
int main()
{
int i,n,m,k,root=1,q;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;++i)
{
scanf("%d",&k);
value=k; position=i;
update(root,1,n);
}
for(;m;--m)
{
scanf("%d %d %d",&q,&a,&b);
maxim=-1;
if(q==0) {query(root,1,n); printf("%d\n",maxim);}
if(q==1) {value=b; position=a; update(root,1,n);}
}
return 0;
}