Cod sursa(job #3173331)

Utilizator RusuRRusu Rares RusuR Data 22 noiembrie 2023 16:29:33
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>

std::ifstream f("datorii.in");
std::ofstream g("datorii.out");

const int SIZE=15000;
int a[SIZE*4+4];
int v[SIZE+1];
int n, m;

int combine(int a,int b){
	return a+b;
}

void build(int node, int left, int right){
	if(left==right){
		a[node]=v[left];
		return;
	}
	int mid=(left+right)/2;
	build(node*2,left,mid);
	build(node*2+1,mid+1,right);
	a[node]=combine(a[node*2],a[node*2+1]);
}

void update(int node, int left, int right, int poz, int val){
	if(left==right){
		a[node]-=val;
		return;
	}
	int mid=(left+right)/2;
	if(poz<=mid)
		update(node*2,left,mid,poz,val);
	else
		update(node*2+1,mid+1,right,poz,val);
	a[node]=combine(a[node*2],a[node*2+1]);
}

int query(int node, int left, int right, int ql, int qr){
	if(ql<=left && right<=qr)
		return a[node];
	int mid=(left+right)/2, result=0;
	if(ql<=mid)
		result+=query(node*2, left, mid, ql, qr);
	if(qr>mid)
		result+=query(node*2+1,mid+1,right,ql,qr);
	return result;
}

int main(){
	f>>n>>m;
	for(int i=1;i<=n;i++)
		f>>v[i];
	build(1,1,n);
	while(m--){
		int t, s, e;
		f>>t>>s>>e;
		if(t==1)
			g<<query(1,1,n,s,e)<<'\n';
		else
			update(1,1,n,s,e);
	}
	return 0;
}