Cod sursa(job #2106510)

Utilizator vladcoroian2001Vlad Coroian vladcoroian2001 Data 15 ianuarie 2018 20:45:09
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>

using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
const int NMAX=1e5+5;
int n,m,x,a,b,tip,AIB[NMAX];
void update(int pos,int val)
{
	int k=pos;
	while(k<=n)
	{
		AIB[k]+=val;
		k=k+(k&-k);
	}
}
int f(int pos)
{
	int k=pos,sum=0;
	while(k>=1)
	{
		sum+=AIB[k];
		k=k-(k&-k);
	}
	return sum;
}
int bs(int val)
{
	int hi,lo,mid,sum;
	hi=n;
	lo=1;
	while(lo<=hi)
	{
		mid=(hi+lo)/2;
		sum=f(mid);
		if(sum==val)
			return mid;
		else
		{
			if(sum<a)
				lo=mid+1;
			else
				hi=mid-1;
		}
	}
	return -1;
}
int main()
{
	fi>>n>>m;
	for(int i=1;i<=n;i++)
	{
		fi>>x;
		update(i,x);
	}
	for(int i=1;i<=m;i++)
	{
		fi>>tip;
		if(tip==0)
		{
			fi>>a>>b;
			update(a,b);
		}
		if(tip==1)
		{
			fi>>a>>b;
			fo<<f(b)-f(a-1)<<"\n";
		}
		if(tip==2)
		{
			fi>>a;
			fo<<bs(a)<<"\n";
		}
	}
	fi.close();
	fo.close();
	return 0;
}