Cod sursa(job #2504899)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 5 decembrie 2019 18:49:34
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;
int v[(1<<14)+5],aint[(1<<14)+5],n,c,m,ind;
void buildd () {
	for(int i=n;i<2*n;++i)
		aint[i]=v[i-n+1];
	for(int i=n-1;i>0;--i)
		aint[i]=aint[2*i]+aint[2*i+1];
}
void updatee (int poz, int nr) {
	v[poz]-=nr;
	aint[n+poz-1]-=nr;
	ind=n+poz-1;
	while(ind!=1) {
		ind>>=1;
		aint[ind]=aint[(ind<<1)]+aint[(ind<<1)+1];
	}
}
int querrys (int st, int dr, int cst, int cdr,int indexx) {
	if(cst>=st && cdr<=dr)
		return aint[indexx];
	else {
		int mij=(cst+cdr)/2,rez=0;
		if(st<=mij)
			rez=rez+querrys(st,dr,cst,mij,indexx*2);
		if(dr>mij)
			rez=rez+querrys(st,dr,mij+1,cdr,2*indexx+1);
		return rez;
	}
}
int main () {
	int nr1,nr2,nr3;
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%d%d", &n, &m);++m;
	for(int i=1;i<=n;++i) {
		scanf("%d", &v[i]);
	}
	if((n & (n-1))!=0) {
		for(c=1;n>0;++c)
			if(((1<<c) & n)!=0)
				n=(n ^ (1<<c));
		n=(1<<(c));
	}
	buildd();
	while(--m) {
		scanf("%d%d%d", &nr1, &nr2, &nr3);
		if(nr1==0)
			updatee(nr2,nr3);
		else
			printf("%d\n", querrys(nr2,nr3,1,n,1));
	}
	return 0;
}