Cod sursa(job #418352)

Utilizator mihaionlyMihai Jiplea mihaionly Data 15 martie 2010 19:53:08
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>
using namespace std;
#define f(x) (x^(x-1)&x)
#define nmax 150005
#define ll long long
ll A[nmax];
int n,m;
FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");
void add(int in,int x)
 {
 int i;
 for(i=in;i<=n;i+=f(i))
  A[i]+=x;
 }
ll compute(int x)
 {
 int i;
 ll s=0;
 for(i=x;i>0;i-=f(x))
  s+=A[x];
 return s;
 }
int query(int x)
 {
 int i=0,p=f(n);
 while(p)
  {
  if(i+p<=n)
   if(x>=A[i+p])
    {
    x-=A[i+p];
    i+=p;
    if(!x)
     return i;
    }
    p>>=1;
  }
 return -1;
}
int main()
 {
 int i,ok,a,b;
 ll x;
 fscanf(f,"%d %d",&n,&m);
 for(i=1;i<=n;i++) 
  {
  fscanf(f,"%lld",&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);
   if(a==b)
    fprintf(g,"%d\n",A[a]);
   else
    fprintf(g,"%d\n",compute(b)-compute(a-1));
   }
  else
   {
   fscanf(f,"%d",&a);
   fprintf(g,"%d\n",query(a));
   }
  }
 return 0;
 }