Cod sursa(job #418485)

Utilizator mihaionlyMihai Jiplea mihaionly Data 15 martie 2010 22:21:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>
#define nmax 100005
#define f(x) (x^(x-1)&x)
using namespace std;
FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");
int A[nmax];
int n,m,u;
void add(int ind,int x)
 {
 for(int i=ind;i<=n;i+=f(i))
  A[i]+=x;
 }
int suma(int x)
 {
 int s=0;
 while(x)
  {
  s+=A[x];
  x&=(x-1);
  }
 return s;
 }
int query(int x)
 {
 int p=u,i=0;
 while(p)
  {
  if(i+p<=n)
   if(x>=A[i+p])
    {
    x-=A[i+p];
	i+=p;
	if(!x)
     return i;
    }
  p=p>>1;
  }
 return -1;
 }
int main()
 {
 int i,ok,a,b,x;
 fscanf(f,"%d %d",&n,&m);
 for(u=1;u<n;u<<=1);
 for(i=1;i<=n;i++)
  {
  fscanf(f,"%d",&x);
  add(i,x);
  }
 for(i=1;i<=m;i++)
  {
  fscanf(f,"%d",&ok);
  if(ok==0)
   {
   fscanf(f,"%d %d",&a,&b);
   add(a,b);
   }
  else if(ok==1)
   {
   fscanf(f,"%d %d",&a,&b);
   fprintf(g,"%d\n",(suma(b)-suma(a-1)));
   }
  else
   {
   fscanf(f,"%d",&a);
   fprintf(g,"%d\n",query(a));
   }
  }
 return 0;
 }