Pagini recente » Cod sursa (job #807539) | Cod sursa (job #1995267) | Cod sursa (job #22756) | Cod sursa (job #1556480) | Cod sursa (job #871862)
Cod sursa(job #871862)
// Include
#include <fstream>
using namespace std;
// Constante
const int sz = (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 num, questions;
int tree[sz];
// Main
int main()
{
in >> num >> questions;
int readVal;
for(int i=1 ; i<=num ; ++i)
in >> readVal, update(i, readVal);
int type;
while(questions--)
{
in >> type;
if(type)
{
if(type == 1)
{
int left, right;
in >> left >> right;
out << query(right) - query(left-1) << '\n';
}
else
{
in >> readVal;
out << search(readVal) << '\n';
}
}
else
{
int position;
in >> position >> readVal;
update(position, readVal);
}
}
in.close();
out.close();
return 0;
}
void update(int position, int value)
{
int power = 0;
while(position <= num)
{
tree[position] += value;
while(!(1<<power & position))
++power;
position += (1<<power);
}
}
int query(int position)
{
int power = 0;
int sum = 0;
while(position)
{
sum += tree[position];
while(!(1<<power & position))
++power;
position -= (1<<power);
}
return sum;
}
int search(int value)
{
int left = 1, right = num;
while(left <= right)
{
int mid = (left+right) / 2;
int sum = query(mid);
if(sum == value)
return mid;
if(value < sum)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}