Pagini recente » Cod sursa (job #130106) | Cod sursa (job #2334808) | Cod sursa (job #3240043) | Cod sursa (job #578788) | Cod sursa (job #2267165)
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
vector<int> a;
vector<int> blocks(150);
int block_size;
void build(){
block_size = ceil(sqrt(a.size()));
blocks.resize(block_size);
for(int i=0;i<=block_size;i++){
blocks[i] = 0;
}
for(int i=0;i<a.size();i++){
blocks[i/block_size]+=a[i];
//std::cout<<i/block_size<<" "<<blocks[i/block_size]<<endl;
}
}
void update(int index, int new_value){
int old_value = a[index];
blocks[index/block_size] += (new_value - old_value);
a[index] = new_value;
}
long long query(int l, int r){
long long sum = 0;
int start_block = l/block_size;
int end_block = r/block_size;
if(start_block == end_block){
for(int i=l;i<=r;i++){
sum+=a[i];
}
return sum;
}
for(int i=l;i<(start_block+1)*block_size;i++){
sum+=a[i];
}
for(int i=end_block*block_size;i<=r;i++){
sum+=a[i];
}
for(int i=start_block+1;i<end_block;i++){
sum+=blocks[i];
}
return sum;
}
int main() {
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n,m;
fin>>n>>m;
// a.resize(n);
for(int i=0;i<n;i++){
int p;
fin>>p;
a.push_back(p);
}
build();
while(m--){
int x;
fin>>x;
if(x == 0){
int t,v;
fin>>t>>v;
update(t-1,a[t-1]-v);
}else{
int l,r;
fin>>l>>r;
fout<<query(l-1,r-1)<<endl;
}
}
}