Cod sursa(job #2203519)

Utilizator shantih1Alex S Hill shantih1 Data 12 mai 2018 16:29:15
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

int p,cat,n,i,j,nr,sum[400000],l1,l2,a,b,x,m,k,o,s;

void update(int nr,int st,int dr)
{
	if(st==dr)
	{
		sum[nr]+=cat;
		return;
	}
	int md=(st+dr)/2;
	if(p<=md)   update(nr*2,st,md);
	else        update(nr*2+1,md+1,dr);
	sum[nr]=sum[nr*2]+sum[nr*2+1];
}

int queab(int nr,int st,int dr)
{
	if(st>=a&&dr<=b)    return sum[nr];
	int md=st+(dr-st)/2,r=0;
	if(max(st,a)<=min(md,b))    r+=queab(nr*2,st,md);
	if(max(md+1,a)<=min(dr,b))    r+=queab(nr*2+1,md+1,dr);
	return r;
}

int quek(int nr,int st,int dr)
{
	if(st==dr)  
	{	
		s+=sum[nr];
		return st;	
	}
	int md=st+(dr-st)/2,p=0;
	if(sum[nr*2]>=k)    p=quek(nr*2,st,md);
	else
	{
		k-=sum[nr*2];
		s+=sum[nr*2];
		p=quek(nr*2+1,md+1,dr);
	}
	return p;
}

int main()
{
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{
		p=i;
		fin>>cat;
		update(1,1,n);
	}
	for(i=1;i<=m;i++)
	{
		fin>>o;
		if(o==0)
		{
			fin>>p>>cat;
			update(1,1,n);
		}
		if(o==1)
		{
			fin>>a>>b;
			fout<<queab(1,1,n)<<"\n";
		}
		if(o==2)
		{
			fin>>k;
			s=0;	nr=k;
			o=quek(1,1,n);
			if(s==nr)	fout<<o<<"\n";
			else	fout<<"-1\n";
		}
	}
	return 0;
}