Cod sursa(job #1498025)

Utilizator ArkinyStoica Alex Arkiny Data 7 octombrie 2015 21:28:19
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<fstream>
#include<iostream>
#include<string.h>
using namespace std;

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

#define MAX 100001

int AIB[MAX],N,M;

void update(int x, int y)
{
	for (;x <= N;x += x&(-x))
		AIB[x] += y;
}
int query(int x)
{
	int s = 0;
	for (;x;x -= x&(-x))
		s += AIB[x];
	return s;
}

int main()
{
	in >> N >> M;
	int x, y, op;
	for (int i = 1;i <= N;++i)
	{
		in >> x;
		update(i, x);
	}
	for (int i = 1;i <= M;++i)
	{
		in >> op;
		switch (op)
		{
		case 0:
			in >> x >> y;
			update(x, y);
			break;
		case 1:
			in >> x >> y;
			out << query(y) - query(x - 1) << '\n';
			break;
		case 2:
		{
			int l = 1, r = N;
			in >> x;
			int min = (1 << 30);
			while (l <= r)
			{
				int mid = (l + r) / 2;
				int v = query(mid);
				if (v == x)
				{
					min = mid;
					r = mid - 1;
				}
				else if (v < x)
					l = mid + 1;
				else
					r = mid - 1;

			}
			if (min == (1 << 30))
				out << -1 << '\n';
			else
				out << min << '\n';
			break;
		}

		}
	}
	return 0;
}