Cod sursa(job #303620)

Utilizator petrecgClinciu Glisca Petre petrecg Data 10 aprilie 2009 01:32:17
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
long a[100000],b[100000],aib[100000],i,j,x,y,n,st,fn,s,s1,s2,m,mij,c;
int main()
{freopen("aib.in","r",stdin);freopen("aib.out","w",stdout);
 scanf("%ld%ld",&n,&m);
 for(i=1;i<=n;i++)
  {j=i;b[i]=1;while(j%2==0){b[i]*=2;j/=2;}}
 for(i=1;i<=n;i++)
  {scanf("%ld",&a[i]);
   for(j=i;j<=n;j+=b[j])aib[j]+=a[i];
  }
 for(;m;m--)
  {scanf("%ld",&c);
   if(c==0){scanf("%ld%ld",&x,&y);for(i=x;i<=n;i+=b[i])aib[i]+=y;}
    else
     if(c==1){scanf("%ld%ld",&x,&y);s1=s2=0;
	      for(i=x-1;i>=1;i-=b[i])s1+=aib[i];
	      for(i=y;i>=1;i-=b[i])s2+=aib[i];
	      s2=s2-s1;printf("%ld\n",s2);
	     }
      else{st=1;fn=n;scanf("%ld",&s);
	   while(st<fn)
	    {mij=(st+fn)/2;
	     s1=0;for(i=mij;i>=1;i-=b[i])s1+=aib[i];
	     if(s1>s)fn=mij;
		else if(s1<s)st=mij+1;else st=fn=mij;
	    }
	   s1=0;
	   for(i=st;i>=1;i-=b[i])s1+=aib[i];
	   if(s1!=s)printf("-1\n");else printf("%ld\n",st);
	  }
  }
 fclose(stdin);fclose(stdout);
 return 0;
}