Cod sursa(job #538431)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 21 februarie 2011 12:46:51
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<iostream.h>
#include<fstream.h>
#define N 100001
long n,m,i,a[N],y,z,h[18*N],j,k,t;
int x;

long maximus(long x,long y)
{if(x<y)
       return y;
return x;}

long maxim(long h[18*N],long nod,long st,long dr,long y,long z)
{long mij=(st+dr)/2,t1=0,t2=0;
if(y<=st&&dr<=z)
       return h[nod];
if(y<=mij)
       t1=maxim(h,2*nod,st,mij,y,z);
if(z>mij)
       t2=maxim(h,2*nod+1,mij+1,dr,y,z);
return maximus(t1,t2);}

void add(long h[18*N],long nod,long x,long st,long dr,long y)
{long m=(st+dr)/2;
if(st==dr)
       {h[nod]=y;
       while(nod>1)
              {nod/=2;
              h[nod]=maximus(h[2*nod],h[2*nod+1]);}
       return;}
if(x<=m)
       add(h,2*nod,x,st,m,y);
else
       add(h,2*nod+1,x,m+1,dr,y);}

int main()
{ifstream f1("arbint.in");
ofstream f2("arbint.out");
f1>>n>>m;
for(k=1;(1<<k)<=n;k++);
k--;
t=k*n;
for(j=1;j<=t;j++)
       h[j]=-1;
for(i=1;i<=n;i++)
       {f1>>a[i];
       add(h,1,i,1,n,a[i]);}
for(i=1;i<=m;i++)
       {f1>>x>>y>>z;
       if(x==0)
                 f2<<maxim(h,1,1,n,y,z)<<endl;
       else
                 add(h,1,y,1,n,z);}
f1.close();
f2.close();
return 0;}