Cod sursa(job #1799010)

Utilizator nnnmmmcioltan alex nnnmmm Data 5 noiembrie 2016 17:37:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<cstdio>
#include<algorithm>

const int NMAX=100001,INF=1000000001;

int v[NMAX];

int aint[4*NMAX];

void Build(int nod,int st,int dr)
{
 if(st==dr)
    {
     aint[nod]=v[st];
     return;
    }
 int mij=(st+dr)/2;
 Build(2*nod,st,mij);
 Build(2*nod+1,mij+1,dr);
 aint[nod]=std::max(aint[2*nod],aint[2*nod+1]);
}

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

int rasp=-INF;

void Query(int nod,int st,int dr,int x,int y)
{
 if(x<=st && dr<=y)
    {
     rasp=std::max(rasp,aint[nod]);
     return;
    }
 int mij=(st+dr)/2;
 if(x<=mij)
    Query(2*nod,st,mij,x,y);
 if(mij<y)
    Query(2*nod+1,mij+1,dr,x,y);
}

int main()
{
 FILE *in=fopen("arbint.in","r");
 int n,m;
 fscanf(in,"%d %d ",&n,&m);
 for(int i=1;i<=n;i++)
     fscanf(in,"%d ",&v[i]);
 Build(1,1,n);
 FILE *out=fopen("arbint.out","w");
 for(int i=1;i<=m;i++)
     {
      int tip,x,y;
      fscanf(in,"%d %d %d ",&tip,&x,&y);
      if(!tip)
         {
          if(x>y)
             std::swap(x,y);
          rasp=-INF;
          Query(1,1,n,x,y);
          fprintf(out,"%d\n",rasp);
         }
      else
         Update(1,1,n,x,y);
     }
 fclose(in);
 fclose(out);
 return 0;
}