Cod sursa(job #680719)

Utilizator ELHoriaHoria Cretescu ELHoria Data 15 februarie 2012 20:57:54
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <cstdio>

int aib[100005] , N , M , logm;
int getpos(int s)
{
	for(int i = 0 , stp = logm;stp;stp>>=1)
		if(i + stp <= N && s >= aib[i + stp])
		{
			i+=stp , s-=aib[i];
			if(!s) return i;
		}
	return -1;
}

int query(int i)
{
	int s;
	for(s = 0;i > 0;i-=(i & -i)) s+=aib[i];
	return s;
}
void update(int i,int x)
{
	for(;i <= N;i+=(i & -i))
		aib[i]+=x;
}

int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d %d",&N,&M);
	for(logm = 1;logm <= N;logm<<=1);
	for(int i = 1 , val;i <= N;++i)
		scanf("%d",&val), update(i,val);
	for(int x , y , t;M;M--)
	{
		scanf("%d",&t);
		if(t < 2) {
		scanf("%d %d",&x,&y);
		if(t == 1) printf("%d\n",query(y) - query(x - 1));
		else
			if(t == 0) update(x,y);
		}
		else
		if(t == 2)
			scanf("%d",&x) , printf("%d\n",getpos(x));
	}
	return 0;
}