Pagini recente » Cod sursa (job #2728643) | Cod sursa (job #603437) | Cod sursa (job #221234) | Istoria paginii runda/gigi.gigi | Cod sursa (job #2445004)
#include <fstream>
#define NMAX 100010
#define ll int
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
ll v[NMAX], aib[NMAX], n ,m, tip, a, b;
void update(ll nod, ll val)
{
for(ll i = nod; i <= n; i += (i & (-i)) )
aib[i] += val;
}
ll suma(ll nod)
{
ll sum = 0;
for(ll i = nod; i; i -= (i & (-i)))
sum += aib[i];
return sum;
}
ll cb(ll k)
{
ll st, dr, mid,ans = 0;
st = 1, dr = n;
while(st <= dr)
{
mid = st + (dr - st) / 2;
if(suma(mid) < k)
{
ans = mid;
st = mid + 1;
}
else dr = mid - 1;
}
if(suma(ans+1) == k)
return ans+1;
else return -1;
}
int main()
{
f >> n >> m;
for(ll i = 1; i <= n; ++i)
{
f >> v[i];
update(i, v[i]);
}
for(ll i = 1; i <= m; ++i)
{
ll task;
f >> task;
if(task == 0)
{
f >> a >> b;
update(a,b);
}
else if(task == 1)
{
f >> a >> b;
g << suma (b) - suma(a - 1) << '\n';
}
else if(task == 2)
{
f >> a;
g << cb(a) << '\n' ;
}
}
f.close();
g.close();
return 0;
}