Cod sursa(job #3252707)

Utilizator JohnnyFortaPascu Ioan JohnnyForta Data 30 octombrie 2024 18:54:12
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <vector>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <fstream>

class SQRTDecomposition{
  std::vector<int> nums, b, updates;
  int length;

public:
 
  void update(int index, int value){
    nums[index] = value;
    int bucket = index/length;
    b[bucket] = 0;
    for(int i = bucket * length; i < (bucket + 1) * length; i++)
      b[index / length] = std::max(b[index / length], nums[i]);
  }

  int query(int left, int right){
    int m = 0;
    for(left; left <= right && (left % length != 0); left++){
      m = std::max(m, nums[left]);
    }
    for(left; left + length <= right; left += length){
      m = std::max(m,  b[left / length] + length * updates[left / length]);
    }

    for(left; left <= right; left++){
      m = std::max(m, nums[left]);
    }

    return m;
  }

  SQRTDecomposition(std::vector<int> nums){
    int n = nums.size();
    // std::cout<<n<<std::endl;
    length = sqrt(n);
    // std::cout<<length<<std::endl;
    // std::cout<<ceil(float(n) / length)<<std::endl;
    this->nums = nums;
    b.resize(ceil(float(n) / length));
    updates.resize(ceil(float(n) / length));
    for(int i = 0; i < n; i++){
      b[i / length] = std::max(b[i / length], nums[i]);
    }
  }

  void show(){
    std::cout<<"Nums: ";
    for(auto x : nums){
      std::cout<<x<<' ';
    }
    std::cout<<std::endl;
    std::cout<<"Buckets: ";
    for(auto x : b){
      std::cout<<x<<' ';
    }
    std::cout<<std::endl;
    std::cout<<"Updates: ";
    for(auto x : updates){
      std::cout<<x<<' ';
    }
    std::cout<<std::endl;
  }
};

int main(){
  int n, m, op, arg1, arg2;
  std::ifstream in("arbint.in");
  std::ofstream out("arbint.out");
  in>>n>>m;
  std::vector<int> v(n);
  for(int i = 0; i < n; i++){
    in>>v[i];
  }
  SQRTDecomposition sd(v);
  for(int i = 0; i < m; i++){
    in>>op>>arg1>>arg2;
    if(op == 0){
      out<<sd.query(arg1 - 1, arg2 - 1)<<std::endl;
    }else{
      sd.update(arg1 - 1, arg2);
    }
  }
}