Cod sursa(job #2062850)

Utilizator xRoALexBirtoiu Alexandru xRoALex Data 10 noiembrie 2017 21:34:46
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005
using namespace std;

FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");

int m,n,x,y,cer;
int arb[4+Nmax];

void update(int node)
{
    arb[node]=max(arb[2*node+1],arb[2*node]);
    if(node>1)
    update(node/2);
}

int query(int st, int dr) {
  int ans = 0;
  if(st == dr) {
    ans = arb[st];
  } else if(st < dr) {
    if(st % 2 == 1) {
      ans = max(ans, arb[st]);
      st++;
    }
    if(dr % 2 == 0) {
      ans = max(ans, arb[dr]);
      dr--;
    }
    ans = max(ans, query(st / 2, dr / 2));
  }
  return ans;
}

int main()
{
    int k=1;
    fscanf(f,"%d%d",&n,&m);
    while((1<<k)<n)
    k++;
    int Ni=(1<<k)-1;
    for(int i=1;i<=n;i++)
    {
        int x;
        fscanf(f,"%d",&x);
        arb[Ni+i]=x;
        update((Ni+i)/2);
    }
    while(m)
    {
        fscanf(f,"%d%d%d",&cer,&x,&y);
        if(cer==1)
        {
            arb[Ni+x]=y;
            update((Ni+x)/2);
        }
        else
        {
            fprintf(g,"%d\n",query(Ni+x,Ni+y));
        }
        m--;
    }
    return 0;
}