Cod sursa(job #2866197)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 9 martie 2022 13:52:17
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <unordered_map>

#define NMAX 100003


using namespace std;

int n,q;
int aib[NMAX];

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

void update(int poz, int val)
{
	for (int i = poz; i <= n; i += i & (-i))
	{
		aib[i] += val;
	}
}

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

int cBin(int val)
{
	int st = 1, dr = n;
	while (st <= dr)
	{
		int mij = (st + dr) / 2;
		int sMij = sum(mij);
		if (sMij == val)
		{
			return mij;
			
		}
		else if(sMij>val){
			dr = mij - 1;
		}
		else {
			st = mij + 1;
		}
	}
	return -1;
}

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

	for (int i = 1; i <= q; i++)
	{
		int cer;
		fin >> cer;
		if (cer == 0)
		{
			int poz, val;
			fin >> poz >> val;
			update(poz,val);
		}
		else if(cer==1){
			//e query
			int st, dr;
			fin >> st >> dr;
			fout << sum(dr) - sum(st - 1) << "\n";	
		}
		else {
			int val;
			fin >> val;
			fout<<cBin(val)<<"\n";
		}
	}
	return 0;
}