Cod sursa(job #1147971)

Utilizator iarbaCrestez Paul iarba Data 20 martie 2014 12:23:23
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
using namespace std;
int a[1<<17],n,m,i,poz,val,s,y,c,x;
void update()
{
	a[poz]+=val;
	int aux=poz,r=0;
	while((aux>>r)%2==0){r++;}
	poz+=1<<r;
	if(poz<=n){update();}
}
void query()
{
	s+=a[poz];
	int aux=poz,r=0;
	while((aux>>r)%2==0){r++;}
	poz-=1<<r;
	if(poz){query();}
}
void smartquery()
{
	poz=y;s=0;query();
	int s2=s;
	poz=x-1;
	s=0;
	if(poz){query();}
	s=s2-s;
}
void search(int st, int sf)
{
    y=(st+sf)/2;poz=y;
    s=0;query();
    if(s==val){return;}
    if(st==sf){
        y=-1;
        return;
              }
    if(s>=val){search(st,y);return;}
    else{search(y+1,sf);return;}
}
int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++){
		scanf("%d",&val);poz=i;
		update();
						   }
	while(m--){
		scanf("%d",&c);
		if(c==0){
			scanf("%d%d",&poz,&val);
			update();
				}
		if(c==1){
			scanf("%d%d",&x,&y);
			smartquery();
			printf("%d\n",s);
				}
		if(c==2){
			scanf("%d",&val);
			x=1;search(1,n);
			printf("%d\n",y);
				}
			  }
return 0;
}