Cod sursa(job #433413)

Utilizator O_NealS. Alex O_Neal Data 3 aprilie 2010 17:51:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<stdio.h>
#define infile "aib.in"
#define outfile "aib.out"
#define nmax 200000
int arb[nmax];
int n; 
int poz,val;
int a,b; 

void add(int rad, int st, int dr)
{
	if(st==dr) { arb[rad]+=val; return; } 
	int mij=(st+dr)>>1;
	arb[rad]=0;
	if(poz<=mij && (rad<<1)<nmax) add(rad<<1,st,mij);
	if(mij<poz && ((rad<<1)|1)<nmax) add((rad<<1)|1,mij+1,dr);
	if((rad<<1)<nmax) arb[rad]+=arb[rad<<1];
	if(((rad<<1)|1)<nmax) arb[rad]+=arb[(rad<<1)|1];
}

int query(int rad, int st, int dr)
{
	if(a<=st && dr<=b) return arb[rad];
	int mij=(st+dr)>>1;
	int sum=0;
	if(a<=mij && (rad<<1)<nmax) sum+=query(rad<<1,st,mij);
	if(mij<b && ((rad<<1)|1)<nmax) sum+=query((rad<<1)|1,mij+1,dr);
	return sum;
}

int query2(int rad, int st, int dr, int sum)
{
	if(arb[rad]==sum) return dr-st+1;
	if(arb[rad]<sum || st==dr) return -1;
	int mij=(st+dr)>>1;
	if((rad<<1)<nmax && sum<=arb[rad<<1]) return query2(rad<<1,st,mij,sum);
	else if(((rad<<1)|1)<nmax)
	{
		int x=query2((rad<<1)|1,mij+1,dr,sum-arb[rad<<1]);
		if(x<0) return -1;
		return mij-st+1+x;
	}
	else return -1;
}

int main()
{
	int t,u;
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	scanf("%d %d\n",&n,&t);
	

	for(poz=1;poz<=n;poz++)
	{
		scanf("%d",&val);
		add(1,1,n);
	}
	

	while(t--)
	{
		scanf("%d ",&u); 
		if(!u)
		{ 
			scanf("%d %d\n",&poz,&val);
			add(1,1,n);
		}
		else if(u==1)
		{ 
			scanf("%d %d\n",&a,&b);
			printf("%d\n",query(1,1,n));
		}
		else if(u==2)
		{ 
			scanf("%d\n",&val);
			printf("%d\n",query2(1,1,n,val));
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}