Cod sursa(job #303982)

Utilizator tibiletsKoos Tiberiu Iosif tibilets Data 10 aprilie 2009 17:38:42
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <fstream.h>
inline int Minim(int a, int b) 
{       if ( a < b ) return a;
       return b;}
int N,M,a,b,A[100001],p,i=1;
void act(int a, int b)
{p=0;
 while(a<=N)
 {A[a]+=b;
  while(!(a&(1<<p)))
   ++p;
  a+=1<<p;
  ++p;}
}
int in(int a)
{p=0;b=0;
 while(a>0)
 {b+=A[a];
  while(!(a&(1<<p)))
   ++p;
  a-=1<<p;
  ++p;
 }
 return b;}
int caut(int a)
{i=0;p=1;
 while(p<N)
  p<<=1; 
 while(p&&i+p<=N)
 {if(a>=A[i+p]) 
  {i+=p;a-=A[i];
   if(!a)return i;
  }
  p>>=1;	 
 }
 return -1;}
int main()
{ifstream f("aib.in");
ofstream g("aib.out");
f>>N>>M;
for(;i<=N;++i)
{f>>a;
 act(i,a);}
for(;M;--M)
{f>>p;
 if(p<2)
 {f>>a>>b;
  if(!p)act(a,b);
  else g<<in(b)-in(a-1)<<'\n';}
 else
 {f>>a;
  g<<caut(a)<<'\n';
 }
}
return 0;
}