Cod sursa(job #279975)

Utilizator BaduBadu Badu Badu Data 13 martie 2009 09:47:10
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<stdio.h>
#define N 100005

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

int n, m,A[N];

void add(int poz,int val){

	for(;poz<=n;){
		A[poz]+=val;
		poz+=(poz ^ (poz-1))&poz;
	}
}

int suma(int poz){
	int suma=0;
	for(;poz;){
		suma+=A[poz];
		poz-=(poz ^ (poz-1))&poz;
	}
	return suma;
}

int search(int sum){
	int st,dr,mj,s;
	st=1;dr=n;
	while(st<=dr){
		mj = (st+dr)>>1;
		s=suma(mj);
		if(s > sum) dr=mj-1;
		else st=mj+1;
	}
        if(suma(dr)!=sum)return -1;
        return dr;
}

int main(){

	int o,i,a,b;

	fscanf(f,"%d%d",&n,&m);

	for(i=1;i<=n;i++){ fscanf(f,"%d",&a); add(i,a); }
	for(;m--;){
		fscanf(f,"%d",&o);

		if(o>1){
			fscanf(f,"%d",&a);
			fprintf(g,"%d\n",search(a));
		}else{  fscanf(f,"%d%d",&a,&b);
			if(!o) add(a,b);//el. de pe poz. a += b
			else { fprintf(g,"%d\n",suma(b)-suma(a-1)); }
		}
	}
	return 0;
}