Pagini recente » Diferente pentru home intre reviziile 641 si 640 | Cod sursa (job #1389077) | Cod sursa (job #2899765) | Cod sursa (job #479980) | Cod sursa (job #1761497)
#include <stdio.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 index = 1;
while( binaryIndexedTree[index] != value && index <= numberOfItems )
{
index = GetNext(index);
}
if( index <= numberOfItems )
{
return index;
}
else
{
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;
}