Cod sursa(job #2504912)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 5 decembrie 2019 19:06:32
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;
int v[(1<<20)+5],aint[(1<<20)+5],n,c,m,ind;
const int lim=1003;int u=lim-1; char sir[lim];
void next () {
	++u;
	if(u==lim)
		fread(sir,lim,1,stdin),u=0;
}
void get (int &nr) {
	nr=0;
	for(;sir[u]<'0' || sir[u]>'9';next());
	for(;sir[u]>='0' && sir[u]<='9';next())
		nr=nr*10+sir[u]-'0';
}
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];
	}
	aint[1]=aint[2]+aint[3];
}
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);
	get(n);get(m);++m;
	for(int i=1;i<=n;++i) {
		get(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) {
		get(nr1);get(nr2);get(nr3);
		if(nr1==0)
			updatee(nr2,nr3);
		else
			printf("%d\n", querrys(nr2,nr3,1,n,1));
	}
	return 0;
}