Cod sursa(job #3173089)

Utilizator TheAndreiEnache Andrei Alexandru TheAndrei Data 21 noiembrie 2023 20:44:26
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <math.h>

#define NMAX 100003

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, v[NMAX], sq, batog_size, batog[400], interval;

void build_batog(){
    for(int i=1;i<=n;i++){
      int j=i/sq;
      if(v[i]>batog[j])
        batog[j]=v[i];
    }
}

int query(int left, int right){
    int firstInterval = (left + sq - 1) / sq * sq;
    int lastInterval = right / sq * sq+1;
    int firstIntervalc=firstInterval/sq;
    int lastIntervalc=lastInterval/sq;
    int el_max=0;
    //cout<<firstInterval<<" "<<lastInterval<<"\n";
    while(left<=right&&left<firstInterval){
        if(v[left]>el_max)
            el_max=v[left];
        left++;
    }
    while(right>=left&&right>lastInterval){
        if(v[right]>el_max)
            el_max=v[right--];
        right--;
    }

    while(firstIntervalc<=lastIntervalc){
        if(batog[firstIntervalc]>el_max)
            el_max=batog[firstIntervalc];
        firstIntervalc++;
    }

    return el_max;
}

int main()
{
    fin>>n>>m;
    sq=sqrt(n);
    batog_size=(n+sq-1)/sq;

    for(int i=1;i<=n;i++)
      fin>>v[i];

    build_batog();

    int operatie, e1, e2;
    for(int i=0;i<m;i++){
      fin>>operatie>>e1>>e2;
      if(!operatie)
        fout<<query(e1, e2)<<"\n";
      else{
          v[e1]=e2;
          interval=e1/sq;
          int left=interval*sq;
          int right=(interval+1)*sq-1;
          batog[interval]=0;
          while(left<=right){
            if(v[left]>batog[interval])
                batog[interval]=v[left];
            left++;
          }

      }
    }


    return 0;
}