Pagini recente » Cod sursa (job #1709825) | Cod sursa (job #2653754) | Cod sursa (job #2891136) | Cod sursa (job #263594) | Cod sursa (job #748891)
Cod sursa(job #748891)
//Include
#include <fstream>
using namespace std;
//Constante
const int MAX_SIZE = (int)1e5+1;
//Functii
void update(int position, int value);
int query(int position);
int search(int value);
//Variabile
ifstream in("aib.in");
ofstream out("aib.out");
int elements, questions;
int tree[MAX_SIZE];
//Main
int main()
{
in >> elements >> questions;
int val, pos;
for(int i=1 ; i<=elements ; ++i)
{
in >> val;
update(i, val);
}
int type;
int left, right;
while(questions--)
{
in >> type;
if(type)
{
if(type == 1)
{
in >> left >> right;
out << search(right) - search(left-1) << '\n';
}
else
{
in >> right;
out << search(right) << '\n';
}
}
else
{
in >> pos >> val;
update(pos, val);
}
}
}
void update(int position, int value)
{
int power = 0;
while(position <= elements)
{
tree[position] += value;
while(!(1<<power & position))
++power;
position += 1<<power;
}
}
int query(int position)
{
int sum = 0;
int power = 0;
while(position)
{
sum += tree[position];
while(!(1<<power & position))
++power;
position -= 1<<power;
}
return sum;
}
int search(int value)
{
int left = 1, right = elements;
while(left <= right)
{
int mid = (left+right)>>1;
int sum = query(mid);
if(sum == value)
return mid;
if(value < mid)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}