Pagini recente » Cod sursa (job #1224348) | Cod sursa (job #676170) | Cod sursa (job #1968809) | Cod sursa (job #310118) | Cod sursa (job #2296528)
#include <iostream>
#include <fstream>
using namespace std;
ifstream si("aib.in");
ofstream so("aib.out");
int aib[100005],n;
inline void update(int poz,int a)
{
while(poz<=n)
{
aib[poz]+=a;
poz+=(poz&(-poz));
}
}
inline int query1(int a)
{
int sol=0;
while(a)
{
sol+=aib[a];
a-=a&(-a);
}
return sol;
}
int query2(int a)
{
int poz=0;
for(int i=1<<17;i;i>>=1)
{
if(i+poz<=n)
{
if(aib[i+poz]<=a)
{
poz+=i;
a-=aib[poz];
if(!a)
return poz;
}
}
}
return -1;
}
int main()
{
int m;
si>>n>>m;
int a,b,c;
for(int i=1;i<=n;++i)
{
si>>a;
update(i,a);
}
while(m--)
{
si>>a>>b;
if(a==0)
{
si>>c;
update(b,c);
}
else
{
if(a==1)
{
si>>c;
so<<query1(c)-query1(b-1)<<'\n';
}
else
{
so<<query2(b)<<'\n';
}
}
}
return 0;
}