Pagini recente » Cod sursa (job #654993) | Cod sursa (job #1979135) | Cod sursa (job #2445651) | Cod sursa (job #60618) | Cod sursa (job #1482761)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("aib.in");
ofstream os("aib.out");
typedef vector<int> VI;
int n, m;
VI s;
void Read();
void Update(int poz, int val);
int Sum(int poz);
int BS(int val);
int main()
{
Read();
int tip, a, b;
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 md;
}
int Sum(int poz)
{
int q = 0;
for ( int i = poz; i; i -= i & -i )
q += s[i];
return q;
}
void Update(int poz, int val)
{
for ( int i = poz; i <= n; i += i & -i )
s[i] += val;
}
void Read()
{
is >> n >> m;
int a;
s = VI(n + 1);
for ( int i = 1; i <= n; ++i )
{
is >> a;
Update(i, a);
}
}