Cod sursa(job #402645)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 24 februarie 2010 00:12:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 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, step;     
    for ( step = 1; step < N; step <<= 1 ); //?????

    for( i = 0; step; step >>= 1 )//??????
   {
if( i + step <= N)
         {
            if( x >= A[i+step] )//??????
            {
               i += step, x -= A[i];
                if ( !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();
	
}