Pagini recente » Cod sursa (job #2358326) | Cod sursa (job #1142296) | Cod sursa (job #2780242) | Cod sursa (job #2167861) | Cod sursa (job #2574110)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
int v[NMAX], s[NMAX], c[NMAX];
int putere2k ( int x );
int sum ( int x );
int main()
{
int n, q, i, p, x, y, a, st, dr, mij, r;
fin >> n >> q;
for ( i = 1 ; i <= n ; i++ ) fin >> v[i], s[i] = s[i-1] + v[i];
for ( i = 1 ; i <= n ; i += 2 ) c[i] = v[i];
for ( i = 2 ; i <= n ; i += 2 ) c[i] = s[i] - s[i-putere2k(i)];
while ( q-- )
{
fin >> p >> x;
if ( p == 0 )
{
fin >> y;
for ( i = x ; i <= n ; i += putere2k ( i ) ) c[i] += y;
}
else if ( p == 1 )
{
fin >> y;
a = 0;
for ( i = y ; i > 0 ; i -= putere2k ( i ) ) a += c[i];
for ( i = x - 1 ; i > 0 ; i -= putere2k ( i ) ) a -= c[i];
fout << a << '\n';
}
else
{
r = -1;
st = 1;
dr = n;
while ( st <= dr )
{
mij = ( st + dr ) / 2;
if ( sum ( mij ) == x ) r = mij, dr = mij - 1;
else if ( sum ( mij ) > x ) dr = mij - 1;
else st = mij + 1;
}
fout << r << '\n';
}
}
return 0;
}
int putere2k ( int x )
{
return x & ( x ^ ( x - 1 ) );
}
int sum ( int x )
{
int i, s = 0;
for ( i = x ; i > 0 ; i -= putere2k ( i ) ) s += c[i];
return s;
}