Cod sursa(job #391684)

Utilizator vicenzo_cnuStan Alexandru Dan vicenzo_cnu Data 6 februarie 2010 02:33:23
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<stdio.h>
typedef struct nod{int val;
                   int left;
                   int right;
                   nod *st;
                   nod *dr;} *arb,nod;
int max(int a,int b)
{if(a>b)
return a;
return b;}

void creare(arb p,int x,int y)
{if(p==NULL)
  {p=new nod;
  p->left=x;
  p->right=y;
  p->st=NULL;
  p->dr=NULL;
  return;}
int div;
div=(x+y)/2;
creare(p->st,x,div);
creare(p->dr,div+1,y);
}
void init(arb p,int pos,int va)
{if(p->left==p->right)
  {p->val=va;
  return;}
int div=(p->left+p->right)/2;
if(pos<=div) init(p->st,pos,va);
else init(p->dr,pos,va);
p->val=max(p->st->val,p->dr->val);
}


void inter(arb p,int start,int fin,int &maxim)
{if(start<=p->left && p->right<=fin)
  {if(maxim<p->val)
    maxim=p->val;
    return;}
int div=(p->left+p->right)/2;
if(start<=div) inter(p->st,start,fin,maxim);
if(div<fin) inter(p->dr,start,fin,maxim);
}

int main()
{arb p=NULL;
int n,m,i,j,x,y,maxim;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
creare(p,1,n);
for(i=1;i<=n;i++)
  {scanf("%d",&x);
  init(p,i,x);}
for(i=1;i<=m;i++)
{	scanf("%d %d %d",&j,&x,&y);
        if(j==1)
          init(p,x,y);
        else {maxim=-1;
              inter(p,x,y,maxim);
              printf("%d\n",maxim);
              }
        }
fclose(stdin);
fclose(stdout);
return 0;
}