Pagini recente » Cod sursa (job #2485391) | Cod sursa (job #1981920) | Cod sursa (job #1096351) | Cod sursa (job #878103) | Cod sursa (job #957236)
Cod sursa(job #957236)
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, aib[100005], m;
int zero(int x) { return x & -x;}
void update(int position, int value)
{
while (position<=n)
{
aib[position]+=value; position+=zero(position);
}
}
int query(int position)
{
int ans=0;
while (position)
{
ans+=aib[position]; position-=zero(position);
}
return ans;
}
int main()
{
int x; f>>n>>m;
for (int i=1; i<=n; i++) f>>x, update(i, x);
for (int i=1; i<=m; i++)
{
int tip; f>>tip;
if (tip==0)
{
int pos, val; f>>pos>>val;
update(pos, val);
}
else if (tip==1)
{
int left, right; f>>left>>right;
g<<query(right)-query(left-1)<<'\n';
}
else
{
int x, q, ans=0; f>>x; q=x;
for (int i=1<<16; i>0; i>>=1)
if (i+ans<=n)
if (aib[ans+i]<x)
{
x-=aib[ans+i]; ans+=i;
}
++ans;
if (ans!=-1 && query(ans)!=q) ans=-1;
g<<ans<<'\n';
}
}
return 0;
}