Mai intai trebuie sa te autentifici.
Cod sursa(job #324933)
Utilizator | Data | 18 iunie 2009 01:42:50 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.23 kb |
#include <cstdio>
#define file_in "aib.in"
#define file_out "aib.out"
#define zeros(x) ((x^(x-1))&x)
int aib[100100],v[100100];
int n,m;
int tip,a,b,poz,s;
void add(int x,int val)
{
int i;
for(i=x;i<=n;i+=zeros(i))
aib[i]+=val;
}
int compute(int x)
{
int i,ret=0;
for(i=x;i>0;i-=zeros(i))
ret+=aib[i];
return ret;
}
int binary_search(int val)
{
int i,step,x;
for (step=1;step<=n;step<<=1);
for (i=0;step;step>>=1)
if (i+step<=n && aib[i+step]<=val)
{
i+=step;
val-=aib[i];
if (val==0)
return i;
}
return -1;
}
int main()
{
int i,ret;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d", &n,&m);
for (i=1;i<=n;++i)
{
scanf("%d", &v[i]);
add(i,v[i]);
}
while(m--)
{
scanf("%d", &tip);
if (tip==0)//add
{
scanf("%d %d", &a,&b);
add(a,b);
}
if (tip==1)//compute
{
scanf("%d %d", &a,&b);
printf("%d\n", compute(b)-compute(a-1));
}
if (tip==2)
{
scanf("%d", &a);
printf("%d\n", binary_search(a));
}
}
fclose(stdin);
fclose(stdout);
return 0;
}