Cod sursa(job #1918943)

Utilizator ButmalaiDanButmalai Dan ButmalaiDan Data 9 martie 2017 17:27:03
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<bits/stdc++.h>
using namespace std;
int n, m, arb[100100], x, q, a, b;
void add(int i, int cost)
{
	for(;i <= 100100; i+= (i&(-i)))
	{
		arb[i] += cost;
	}
}
long long get(int i)
{
	long long ans = 0;
	for(;i; i-= (i&(-i)))
	{
		ans += arb[i];
	}
	return ans;
}
int main()
{
	ifstream cin("aib.in");
	ofstream cout("aib.out");
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
	{
		cin >> x;
		add(i,x);
	}
	for (int i = 1 ; i <= m; i++)
	{
		cin >> q;
		if (q != 2)
		{
			cin >> a >> b;
			if (q == 0) add(a,b);
			else
				{
					cout << get(b) - get(a-1) << "\n";
				}
		}else
			{
				cin >> a;
				long long st = 1, dr = 100100;
				while(dr - st >= 5)
				{
					long long mid = (st + dr)/2;
					if (get(mid) >= a) dr = mid-1;
					else st = mid+1;
				}
				bool u = 1;
				for (;st <= dr; st++)
				{
					if (get(st) == a)
					{
						cout << st << "\n";
						u = 0;
						break;
					}
				}
				if (u) cout << "-1\n";
			}
	}
}