Pagini recente » Cod sursa (job #2035756) | Cod sursa (job #3128357) | Cod sursa (job #3128806) | Cod sursa (job #2327516) | Cod sursa (job #1483471)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("aib.in");
ofstream os("aib.out");
typedef vector<int> VI;
int n, m;
VI aib;
void Update(int poz, int val);
int Sum(int poz);
int BS(int val);
int main()
{
is >> n >> m;
aib = VI(n + 1);
int tip, a, b;
for ( int i = 1; i <= n; ++i )
{
is >> a;
Update(i, a);
}
while ( m-- )
{
is >> tip >> a;
if ( tip != 2 )
{
is >> b;
if ( !tip )
Update(a, b);
else
os << Sum(b) - Sum(a - 1) << "\n";
}
else
os << BS(a) << "\n";
}
is.close();
os.close();
return 0;
}
int BS(int val)
{
int st = 1, dr = n, md, sum;
do
{
md = ( st + dr ) / 2;
sum = Sum(md);
if ( sum == val )
return md;
else
if ( sum > val )
dr = md - 1;
else
st = md + 1;
} while ( st <= dr );
return -1;
}
int Sum(int poz)
{
int sum = 0;
for ( int i = poz; i; i -= i & -i )
sum += aib[i];
return sum;
}
void Update(int poz, int val)
{
for ( int i = poz; i <= n; i += i & -i )
aib[i] += val;
}