Pagini recente » Cod sursa (job #2690001) | Cod sursa (job #984434) | Cod sursa (job #846455) | Cod sursa (job #529672) | Cod sursa (job #3252707)
#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);
}
}
}