Cod sursa(job #2267152)

Utilizator BRIOI19Ben Test BRIOI19 Data 23 octombrie 2018 12:48:33
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
vector<int> a;
vector<int> blocks(100000);
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;
	    }
	}
}