Pagini recente » Cod sursa (job #2714030) | Cod sursa (job #140468) | Cod sursa (job #2336252) | Prezentare infoarena | Cod sursa (job #744343)
Cod sursa(job #744343)
//Include
#include <fstream>
using namespace std;
//Constante
const int MAX_SIZE = 100001;
//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 elementNumber, operationNumber;
int operation;
int tree[MAX_SIZE];
//Main
int main()
{
in >> elementNumber >> operationNumber;
int val;
for(int i=1 ; i<=elementNumber ; ++i)
{
in >> val;
update(i, val);
}
while(operationNumber--)
{
in >> operation;
if(!operation) // update
{
int pos, val;
in >> pos >> val;
update(pos, val);
}
else if(operation==1) // query
{
int lf, rt;
in >> lf >> rt;
out << query(rt) - query(lf-1) << '\n';
}
else // search
{
int val;
in >> val;
out << search(val) << '\n';
}
}
in.close();
out.close();
return 0;
}
void update(int position, int value)
{
int power = 0;
while(position <= elementNumber)
{
tree[position] += value;
while(!(position & (1<<power)))
++power;
position += (1<<power);
++power;
}
}
int query(int position)
{
int sum = 0;
int power = 0;
while(position)
{
sum += tree[position];
while(!(position & (1<<power)))
++power;
position -= (1<<power);
}
return sum;
}
int search(int value)
{
int left = 1, right = elementNumber;
while(left<=right)
{
int mid = (left+right)>>1;
int sum = query(mid);
if(sum == value)
return mid;
if(value < sum)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}