Pagini recente » Cod sursa (job #527931) | Cod sursa (job #3182608) | Cod sursa (job #1939098) | Cod sursa (job #1878086) | Cod sursa (job #1761513)
#include <stdio.h>
#include <math.h>
#include <vector>
using namespace std;
vector<int> binaryIndexedTree(100005, 0);
vector<int> items(100005, 0);
int numberOfItems;
int numberOfQueris;
int GetNext(int index)
{
return index + (index & -index);
}
void UpdateBinaryIndexedTree(int value, int index)
{
while( index <= numberOfItems )
{
binaryIndexedTree[index] += value;
index = GetNext(index);
}
}
void BuildBinaryIndexedTree()
{
for( int i = 1; i<=numberOfItems; ++i )
{
UpdateBinaryIndexedTree(items[i-1], i);
}
}
int GetParent(int index)
{
return index - (index & -index);
}
int GetSum( int index )
{
int sum = 0;
while( index > 0 )
{
sum += binaryIndexedTree[index];
index = GetParent(index);
}
return sum;
}
int Search(int value)
{
int step;
for( step = 1; step < numberOfItems; step <<= 1 );
for( int i = 0; step; step >>= 1 )
{
if( i + step <= numberOfItems && value >= binaryIndexedTree[i+step] )
{
i += step;
value -= binaryIndexedTree[i];
if( !value )
{
return i;
}
}
}
return -1;
}
void ProcessQueries()
{
int queryType;
while( numberOfQueris-- )
{
scanf("%d", &queryType);
if( queryType == 2 )
{
int value;
scanf("%d", &value);
printf("%d\n", Search(value));
}
else
{
int aux1;
int aux2;
scanf("%d%d", &aux1, &aux2);
if (queryType == 0)
{
UpdateBinaryIndexedTree(aux2, aux1);
}
else
{
printf( "%d\n", GetSum(aux2) - GetSum(aux1 - 1 ));
}
}
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d", &numberOfItems, &numberOfQueris);
for( int i = 0; i<numberOfItems; ++i )
{
scanf("%d", &items[i]);
}
BuildBinaryIndexedTree();
ProcessQueries();
return 0;
}