Cod sursa(job #855425)

Utilizator OpportunityVlad Negura Opportunity Data 14 ianuarie 2013 22:36:28
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.75 kb
#include <stdio.h>
using namespace std;

FILE *fi=fopen("datorii.in","r"),*fo=fopen("datorii.out","w");

long n,m,i,j,a[100000],op,x,y;

void scade(long poz,long val){
	long z=0;
	a[poz]-=val;
	while (poz<=n){
		while (!(poz & 1<<z)) z++;
		poz+=1<<z;
		a[poz]-=val;
	}
}

long get(long x){
	long aux=a[x],z=0;
	while (x){
		while (!(x & 1<<z)) z++;
		x-=1<<z;
		aux+=a[x];
	}
	return aux;
}

long suma(long st,long dr){
	return (get(dr)-get(st-1));
}

int main(){
	fscanf(fi,"%ld%ld",&n,&m);
	
	for (i=1; i<=n; i++){
		fscanf(fi,"%ld",&x);
		scade(i,x*-1);
	}

	for (i=1; i<=m; i++){
		fscanf(fi,"%ld%ld%ld",&op,&x,&y);
		if (op) fprintf(fo,"%ld\n",suma(x,y)); else scade(x,y);
	}
	
	
	fclose(fi); fclose(fo); return 0;
}