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