Cod sursa(job #261546)

Utilizator adrian69adrian horia adrian69 Data 18 februarie 2009 13:55:55
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<stdio.h>

//int a[100005],
int b[100005];
int n,m;
int stop;
/*void adunare()
{
}*/
void actualizare(int i,int x)
{int j;
 for(j=i;j<=n;j++)
  b[j]+=x;

}
void suma(int i,int j)
{ 
  printf("%d \n",(b[j]-b[i-1]));
}

void apoz(int k,int i,int j)
{if(stop==0&&i<=j){
	if(i==j)
	{if(b[i]==k) {printf("%d \n",i);stop=1;}
	} 
	 else
	 {int med=(i+j)/2;
	 
	if(b[med]==k) {printf("%d \n",med);stop=1;}
	 
		else  
		if(k<b[med])
		  {
			  apoz(k,i,med);
		  }   
		  else
			apoz(k,med+1,j);   
	 }
} 
}
void poz(int k)
{int i,ok=0;
 for(i=1;i<n;i+=2)
  { if(b[i]==k)
    {printf("%d \n",i);ok=1;}
	if(b[i]>k)
    {if(b[i-1]==k)
    {printf("%d \n",i-1);ok=1;}
	  break;
   }  
  }
 if(ok==0&&b[n]==k)
 {printf("%d \n",n);ok=1;
 } 
 if(ok==0)
  printf("-1 \n");
}
int main()
{int i;
 int x,y,z;

 freopen("grader_test5.in","r",stdin);
 freopen("aib.out","w",stdout);
 scanf("%d %d",&n,&m);
 scanf("%d",&x);
// a[1]=x;
 b[1]=x;  
 for(i=2;i<=n;i++)
  {scanf("%d",&x);
  // a[i]=x;
   b[i]+=b[i-1]+x; 
  } 
 
 for(i=0;i<m;i++)
 {
   scanf("%d",&x);
   if(x==0)
   {scanf("%d %d",&y,&z);
    actualizare(y,z);
   }
   if(x==1)
   { scanf("%d %d",&y,&z); 
     suma(y,z);
   }
   if(x==2)
   {scanf("%d",&y); 
    stop=0;
    apoz(y,1,n); 
	if(stop==0)
		printf("-1 \n");
   }
 }
/*  printf("\n");
 for(i=1;i<=n;i++)
	printf("%d ",a[i]);
printf("\n");	 
 for(i=1;i<=n;i++)	 
    printf("%d ",b[i]);
 */

 return 0;
}