Cod sursa(job #905463)

Utilizator cont_testeCont Teste cont_teste Data 5 martie 2013 20:59:47
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<cstdio>

#define MAX_SIZE 100005

using namespace std;

int S[MAX_SIZE],N,M;
int x,tip,a,b;

void update( int poz ,int val )
{
    for(int i=poz; i <= N; i+=i&(-i))
        S[i]+=val;

}
int  query ( int val)
{
    int result=0;
 for(int i= val ; i ; i-=i&(-i) )
        result+=S[i];
 return result;
}
inline int search( int sum )
{
     int left=1,right=N+1;
      int mid;
      int s;
      while( left <= right )
      {
        mid=(left+right)>>1;
		s=query(mid);
		if( s >  sum )
		{
			right=mid-1;
		   continue;
		}
		if(s < sum )
		{
		left=mid+1;
		continue;
		}
		if( s== sum)
          return mid;
 
      }



return -1;




}
int main( void )
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i(1); i <= N ; ++i)
    {
        scanf("%d",&x);
        update(i,x);
    }
    for(int i(1); i <= M ; ++i)
    {
        scanf("%d",&tip);
        if( tip == 0 )
        {
            scanf("%d%d",&a,&b);
            update(a,b);
            continue;
        }
        if( tip == 1)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",query(b)-query(a-1));
            continue;
        }
        if( tip == 2)
        {
         scanf("%d",&a);
         printf("%d\n",search(a));
          continue;
        }

    }



   return 0;

}