Cod sursa(job #1769321)

Utilizator nnnmmmcioltan alex nnnmmm Data 2 octombrie 2016 13:18:31
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<algorithm>

const int NMAX=400001,INF=2147483645;

int arbint[NMAX];

void Clear()
{
 for(int i=1;i<=NMAX;i++)
     arbint[i]=INF;
}

void Update(int nod,int st,int dr,int poz,int val)
{
 if(st==dr)
    {
     arbint[nod]=val;
     return ;
    }
 int mij=(st+dr)/2;
 if(poz<=mij)
    Update(nod*2,st,mij,poz,val);
 else
    Update(nod*2+1,mij+1,dr,poz,val);
 arbint[nod]=std::max(arbint[nod*2],arbint[nod*2+1]);
}

int Query(int nod,int st,int dr,int a,int b)
{
 if(st>=a && dr<=b)
    return arbint[nod];
 int mij=(st+dr)/2,ans=0;
 if(a<=mij)
    ans=std::max(ans,Query(nod*2,st,mij,a,b));
 if(b>=mij+1)
    ans=std::max(ans,Query(nod*2+1,mij+1,dr,a,b));
 return ans;
}

int main()
{
 FILE *in=fopen("arbint.in","r");
 FILE *out=fopen("arbint.out","w");
 int n,m;
 fscanf(in,"%d %d ",&n,&m);
 Clear();
 for(int i=1;i<=n;i++)
     {
      int x;
      fscanf(in,"%d ",&x);
      Update(1,1,n,i,x);
     }
 for(int i=1;i<=m;i++)
     {
      bool tip;
      int a,b;
      fscanf(in,"%d %d %d ",&tip,&a,&b);
      switch(tip)
             {
              case 0:fprintf(out,"%d\n",Query(1,1,n,a,b));
                     break;
              case 1:Update(1,1,n,a,b);
                     break;
              default:break;
             }
     }
 fclose(in);
 fclose(out);
 return 0;
}