Cod sursa(job #391692)

Utilizator vicenzo_cnuStan Alexandru Dan vicenzo_cnu Data 6 februarie 2010 03:19:25
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 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;}

arb creare(arb p,int x,int y)
{if(p==NULL)
  {p=new nod;
   p->st=NULL;
   p->dr=NULL;
   p->left=x;
   p->right=y;}
 if(x!=y)
   { int div=0;
     div=(x+y)/2;
     if(x<=div) p->st=creare(p->st,x,div);
     if(y>div) p->dr=creare(p->dr,div+1,y);}
  return p;
 }

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=0,m=0,i,j,x,y,maxim;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
p=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;
}