Pagini recente » Cod sursa (job #529610) | Cod sursa (job #992719) | Cod sursa (job #1307972) | Cod sursa (job #1202595) | Cod sursa (job #2779718)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin ( "aib.in" );
ofstream fout ( "aib.out" );
int n, a[NMAX];
void update ( int poz, int val );
int sum ( int st, int dr );
int main()
{
int t, i, c, x, y, r, st, dr, mij, s[NMAX];
fin >> n >> t;
s[0] = 0;
for ( i = 1; i <= n; i++ )
{
fin >> x;
s[i] = s[i-1] + x;
if ( i % 2 == 1 ) a[i] = x;
else a[i] = s[i] - s[i-((i^(i-1))&i)];
}
while ( t-- )
{
fin >> c;
if ( c == 0 )
{
fin >> x >> y;
update ( x, y );
}
else if ( c == 1 ) fin >> x >> y, fout << sum ( x, y ) << '\n' ;
else
{
fin >> x;
r = -1;
st = 1, dr = n;
while ( st <= dr )
{
mij = ( st + dr ) / 2;
if ( sum ( 1, mij ) < x ) st = mij + 1;
else if ( sum ( 1, mij ) == x ) r = mij, dr = mij - 1;
else dr = mij - 1;
}
fout << r << '\n';
}
}
return 0;
}
void update ( int poz, int val )
{
while ( poz + ( poz ^ ( poz - 1 ) & poz ) <= n )
{
a[poz] += val;
poz += poz ^ ( poz - 1 ) & poz;
}
a[poz] += val;
}
int sum ( int st, int dr )
{
int r;
if ( st != 1 ) return sum ( 1, dr ) - sum ( 1, st - 1 );
else if ( st == 1 && dr == 1 ) return a[1];
else
{
r = 0;
while ( dr != 0 )
{
if ( dr % 2 == 1 ) r += a[dr], dr--;
else
{
r += a[dr];
dr -= ( dr ^ ( dr - 1 ) & dr );
}
}
return r;
}
}