Cod sursa(job #2801042)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 14 noiembrie 2021 18:53:49
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include<bitset>
#include <map>
#include <cstring>
#include<algorithm>
#define MOD 1234567
using namespace std;

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

int n, m;
long long int A[100001];

void update(long long int val, int poz)
{
	//merg la dreapta lui poz si adaug in toti arborii binari valoarea lui val
	for (int i = poz; i <= n; i += (i & (-i)))
	{
		A[i] += val;
	}
}

long long int sum(int poz)
{
	long long int s = 0;
	for (int i = poz; i >= 1; i -= (i & (-i))) {
		s += A[i];
	}
	return s;
}

int cBin(long long int val)
{
	int sumSt = sum(0);
	int st = 1, dr = n;
	while (st <= dr)
	{
		int mij = (st + dr) / 2;
		long long int s = sum(mij);
		if (s <= val)
		{
			//merg la stanga
			st = mij + 1;
		}
		else {
			dr = mij - 1;
		}
	}
	return dr;
}

int main()
{


	fin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		long long int x;
		fin >> x;
		update(x, i);
	}

	for (int i = 1; i <= m; i++)
	{
		int c;
		fin >> c;

		switch (c) {
		case 0: {
			long long int a, b;
			fin >> a >> b;
			update(b, a);
			break;
		}
		case 1: {
			int a, b;
			fin >> a >> b;
			fout << sum(b) - sum(a - 1) << "\n";
			break;
		}
		case 2: {
			long long int val;
			fin >> val;
			fout << cBin(val)<<"\n";
		}
		}
	}
	return 0;

}