Cod sursa(job #244776)

Utilizator yoyolichIoana Ardeleanu yoyolich Data 15 ianuarie 2009 23:10:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<stdio.h>
#include<string.h>
FILE *f=fopen("aib.in","r"), *g=fopen("aib.out","w");
int n,m,arbore[100001],i,x,k,a,b,pow;


void update(int x, int v)
{
      for( ; x <= n; x += x & -x ) arbore[x]+=v;
}
/*void update(int pos, int val)
{
	int zero=0;
	while(pos<=n)
	{
		arbore[pos]+=val;
		while(!(pos&(1<<zero))) zero++;
		pos+=1<<zero;
		zero++;
	}
}
*/
inline int query(int pos)
{
	int suma2=0;
	for( ; pos ; pos -= pos & -pos) suma2+=arbore[pos];
	return suma2;
}

/*int search(int val, int pow)  
     {  
        int i=0,k;  
          
        for (k=pow;pow&&val;pow>>=1,k=i+pow)  
          if (k<=n&&val>=arbore[k])  
            {  
               val-=arbore[k];   
               i+=pow;  
             }  
         if (!val) return i;  
         return -1;  
    }  
*/
int cautare(int suma)
{
	int pos=n+1,Q,S=0;
	int st=0,dr=n+1;
	
	Q=n;
	S=query(Q);
	
	if(S==suma) pos=n;
	
	while(Q)
	{
		Q=(st+dr)>>1;
		S=query(Q);
		
		if(S>suma)
		{
			if(dr>Q) dr=Q;
			Q--;
		}
		else if(S==suma) 
			{
				if(pos>Q) pos=Q;
				dr=Q, Q--;
		}
		else {
			if(st<Q) st=Q;
			Q++;
		}
		if(Q<=st || Q>=dr) break;
		
	}
	
	if(pos==n+1) return -1;
	return pos;
}

int main()
{
	memset(arbore,0,sizeof(arbore));
	fscanf(f,"%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		fscanf(f,"%d",&x);
		update(i,x);
	}
	//for(i=1;i<=n;i++) fprintf(g,"%d ",arbore[i]);
	for (pow=1;pow<<1<=n;pow<<=1);
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d",&k);
		if(k==0){
			fscanf(f,"%d %d",&a,&b);
			update(a,b);
		}
		else
		if(k==1){
			fscanf(f,"%d %d",&a,&b);
			fprintf(g,"%d\n",query(b)-query(a-1));
		}
		
		else		{
			fscanf(f,"%d",&a);
			fprintf(g,"%d\n",cautare(a));
		}
	}
	fclose(f);
	fclose(g);
	return 0;

}