Cod sursa(job #760682)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 22 iunie 2012 17:02:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<stdio.h>
#define dim 15010
int a,b,n,m,A[dim],H[3*dim],op,i;

FILE*f=fopen("datorii.in","r");
FILE*g=fopen("datorii.out","w");

void read(){
	int i,x;
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;i++){
		fscanf(f,"%d",&x),A[i]=A[i-1]+x;
	}
}

void arbore(int nod,int st,int dr){
	if(st==dr){
		H[nod]=A[st]-A[st-1];
		return;
	}
	int mij=(st+dr)/2;
	arbore(nod*2,st,mij);
	arbore(nod*2+1,mij+1,dr);
	H[nod]=A[dr]-A[st-1];
}

void update(int nod,int st,int dr){
	int mij=(st+dr)/2;
	if(st==dr){
		H[nod]-=b;
		return;
	}
	if(st<=a&&mij>=a)
		update(nod*2,st,mij);
	mij++;
	if(mij<=a&&a<=dr)
		update(nod*2+1,mij,dr);
	H[nod]-=b;
}

int querry(int nod,int st,int dr){
	if(st>=a&&dr<=b)
		return H[nod];
	int sum1=0,sum2=0;
	int mij=(st+dr)/2;
	if(a<=mij&&b>=st)
		sum1=querry(nod*2,st,mij);
	if(a<=dr&&b>=(mij+1))
		sum2=querry(nod*2+1,mij+1,dr);
	return sum1+sum2;
}


int main(){
	read();
	arbore(1,1,n);
	for(i=1;i<=m;i++){
		fscanf(f,"%d%d%d",&op,&a,&b);
		switch(op){
		case 0:
			update(1,1,n);
			break;
		default:
			fprintf(g,"%d\n",querry(1,1,n));
			break;
		}
	}
	return 0;
}