Cod sursa(job #3237708)

Utilizator luc3lexaAlexandrescu Luca luc3lexa Data 12 iulie 2024 01:31:17
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");

const int nmax = 15e3+10;
int n,m,operatie,ans;

vector<int> values(nmax,0),aint(nmax*4,0);

void read_input(){
	fin >> n >> m;
	for(int i = 1; i <=n; i++){
		fin >> values[i];
	}
};

void build_aint(int nod,int index_1,int index_2){
	if(index_1 == index_2){
		aint[nod] = values[index_1];
	}else{
		int mij = (index_1 + index_2)/2;
		build_aint(nod*2,index_1,mij);
		build_aint(nod*2+1,mij+1,index_2);
		aint[nod] = aint[nod*2] + aint[nod*2+1];
	}
};

void update(int nod,int index_1,int index_2,int position,int value){
	if(index_1 == index_2){
		aint[nod] -= value;
	}else{
		int mij = (index_1+index_2)/2;
		if(position <= mij){
			update(nod*2,index_1,mij,position,value);
		}else{
			update(nod*2+1,mij+1,index_2,position,value);
		};
		aint[nod] = aint[nod*2] + aint[nod*2+1];
	}
}

void query(int nod,int index_1,int index_2,int a,int b,int &ans){
	if(index_1 >= a && index_2 <= b){
		ans += aint[nod];
	}else{
		int mij = (index_1+index_2)/2;
		if(a <= mij){
			query(nod*2,index_1,mij,a,b,ans);
		}
		if(b >= mij+1){
			query(nod*2+1,mij+1,index_2,a,b,ans);
		}
	}
}
int main(){
	read_input();
	build_aint(1,1,n);
	for(int i = 1; i <=m; i++){
		fin >> operatie;
		if(operatie == 0){
			int poz,val;
			fin >> poz >> val;
			update(1,1,n,poz,val);
		}else{
			int st,dr;
			fin >> st >> dr;
			ans = 0;
			query(1,1,n,st,dr,ans);
			fout << ans << '\n';
		}
	};
	return 0;
}