Cod sursa(job #2227646)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 1 august 2018 12:15:18
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>

using namespace std;

//#define IOS ios::sync_with_stdio(false), cin.tie(0);

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

const int N = 1e5 + 7;

int a[N];

int n;

void update(int poz, int val)
{
	while(poz <= n)
	{
		a[poz] += val;
		poz += (poz & -poz);
	}
}

int sum(int nod)
{
	if(nod == 0)
		return 0;
	return a[nod] + sum(nod - (nod & -nod));
}

void bs(int x)
{
	int st = 1;
	int dr = n;
	int ans = -1;
	while(st <= dr)
	{
		int mid = (st + dr) / 2;
		int val = sum(mid);
		if(val == x)
		{
			ans = mid; 
			break;
		}
		if(val > x)
			dr = mid - 1;
		else
			st = mid + 1;
	}
	out << ans << '\n';
}

main()
{
	IOS
	int q;
	in >> n >> q;
	for(int i = 1, x; i <= n && cin >> x; i++)
		update(i, x);
	while(q--)
	{
		int cerinta;
		in >> cerinta;
		int a, b;
		switch(cerinta)
		{
			case(0): in >> a >> b; update(a, b); 						 break;
			case(1): in >> a >> b; cout << sum(b) - sum(a - 1) << '\n'; break;
			case(2): in >> a; bs(a);									 break;
		}
	}
}