Pagini recente » Cod sursa (job #895036) | Cod sursa (job #408451) | Cod sursa (job #2134002) | Cod sursa (job #632816) | Cod sursa (job #2127492)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in" );
ofstream g("aib.out");
int BIT[100005], N, M, v[100005];
int getSum( int index)
{
int sum = 0;
while (index>0)
{
sum += BIT[index];
index -= index & (-index);
}
return sum;
}
void updateBIT(int BITree[], int n, int index, int val)
{
while (index <= n)
{
BITree[index] += val;
index += index & (-index);
}
}
void InitBITree(int v[], int N ,int BITree[]) {
for ( int i=1; i<=N; i++ )
updateBIT(BITree, N, i, v[i]);
}
int CautareBinara(int first, int last, int x)
{
int m = (first + last)/2;
int act = getSum(m);
if ( first == last ) return first;
if ( x <= act )
return CautareBinara(first, m, x);
else
return CautareBinara(m+1, last, x);
}
int Problem3(int x)
{
int pos = CautareBinara(1, N, x);
if ( getSum(pos) == x ) return pos;
else return -1;
}
int main()
{
f >> N >> M;
for ( int i=1; i<=N; i++ )
f >> v[i];
InitBITree(v, N, BIT);
int OpType, a, b;
for ( int i=1; i<=M; i++ )
{
f >> OpType >> a;
if ( OpType < 2 ) f >> b;
if ( OpType == 0 ) updateBIT(BIT, N, a, b);
if ( OpType == 1 ) g << getSum(b) - getSum(a-1) << '\n';
if ( OpType == 2 ) g << Problem3(a) << '\n';
}
}