Cod sursa(job #971128)

Utilizator Kira96Denis Mita Kira96 Data 8 iulie 2013 16:35:58
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#define NM 100010
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int S,a,b,A[NM<<2],x,t,i,s,m,n;
void divide(int st,int dr,int po)
{
	int mid=(st+dr)>>1;
	if(st==dr)
	{
		A[po]+=x;
		return ;
	}
	if(i<=mid)
		divide(st,mid,po<<1);
	else
		divide(mid+1,dr,(po<<1)+1);
	A[po]=A[po<<1]+A[(po<<1)+1];
}
void sum(int st,int dr,int po)
{
	if(st>=a&&dr<=b)
	{
		S+=A[po];
		return ;
	}
	int mid=(st+dr)>>1;
	if(a<=mid)
		sum(st,mid,po<<1);
	if(b>mid)
		sum(mid+1,dr,(po<<1)+1);
}
int find(int st,int dr,int po)
{
	if(S+A[po]==s)
		return dr;
	else
	{
		int mid=(st+dr)>>1;
		if(S+A[po<<1]<s)
		{
			S+=A[po<<1];
			return find(mid+1,dr,(po<<1)+1);
		}
		else
			return find(st,mid,po<<1);
	}
}
int main ()
{
	f>>n>>m;
	for(i=1;i<=n;++i)
	{
		f>>x;
		divide(1,n,1);
	}
	while(m--)
	{
		f>>t;
		if(t==0)
		{
			f>>i>>x;
			divide(1,n,1);
		}
		if(t==1)
		{
			S=0;
			f>>a>>b;
			sum(1,n,1);
			g<<S<<"\n";
		}
		if(t==2)
		{
			S=0;
			f>>s;
			g<<find(1,n,1)<<"\n";
		}
	}
	return 0;
}