Cod sursa(job #402642)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 24 februarie 2010 00:05:25
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>

#define NMAX 100010
#define zeros(x) ((x ^ (x-1)) & x)


int A[NMAX];
int N,M;

int comp(int x)
{
	int i;
	int ret=0;
	
	for(i=x;i>0;i-=zeros(i))
		ret +=A[i];
	return ret;
	
}

void add(int x,int q)
{
	int i;
	
	for(i=x;i<=N;i += zeros(i))
		A[i] += q;
	
}

int search(int x)
{
	int i;
	for(i=1;i<=N;i++)
		if (comp(i) == x) return i;
	return -1;
}





void citire()
{
	FILE *fin=fopen("aib.in","r");
	FILE *fout=fopen("aib.out","w");
	int i,x;
	
	fscanf(fin,"%d %d",&N,&M);
	
	for(i=1;i<=N;i++)
	{
		fscanf(fin,"%d",&x);
		add(i,x);
	}
	
	int a,b;
	
	for(i=1;i<=M;i++)
	{
		fscanf(fin,"%d",&x);
		
		if (x==0)	{
						fscanf(fin,"%d %d",&a,&b);
						add(a,b);
					}
		
		if (x==1)	{
						fscanf(fin,"%d %d",&a,&b);
						fprintf(fout,"%d\n",comp(b)-comp(a-1));
					}
		
		if (x==2)	{
						fscanf(fin,"%d",&a);
						fprintf(fout,"%d\n",search(a));
						
					}
		
	}	
fclose(fin);
fclose(fout);
		
}



int main()
{
	citire();
	
}