Cod sursa(job #2686097)

Utilizator cristia_razvanCristia Razvan cristia_razvan Data 18 decembrie 2020 15:21:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m;
int bit[100001];
void update(int p, int x)
{
	while (p <= n)
	{
		bit[p] += x;
		p += (p & (-p));
	}
}

int query(int p)
{
	int sum = 0;
	while (p > 0)
	{
		sum += bit[p];
		p -= (p & (-p));
	}
	return sum;
}

int cb(int x)
{
	int st = 1, dr = n, mij,poz = -1;
	while (st <= dr)
	{
		mij = (st + dr) / 2;
		int ans = query(mij);
		if (ans == x)
		{
			poz = mij;
			dr = mij - 1;
		}
		else if (ans > x)dr = mij - 1;
		else st = mij + 1;
	}

	return poz;
}


int main()
{
	int x, a, b;
	short op;
	fin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		fin >> x;
		update(i, x);
	}
	while (m--)
	{
		fin >> op;
		if (op == 0)
		{
			fin >> a >> b;
			update(a, b);
		}
		else if (op == 1)
		{
			fin >> a >> b;
			fout << query(b) - query(a - 1) << '\n';
		}
		else 
		{
			fin >> a;
			int poz = cb(a);
			fout << poz << '\n';
		}
	}
	fin.close();
	fout.close();
	return 0;
}