Pagini recente » Cod sursa (job #1528810) | Cod sursa (job #2506152) | Cod sursa (job #1527576) | Cod sursa (job #2576179) | Cod sursa (job #2641515)
#include <fstream>
#define ub(i) (i&(-i))
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n,m,i,x,a,b,aib[100005];
void update(int a,int b)
{
for (int i=a;i<=n;i+=ub(i))
aib[i]+=b;
}
int query(int a)
{
int sum=0;
for (int i=a;i>=1;i-=ub(i))
sum+=aib[i];
return sum;
}
int query2(int a)
{
int i=1,sum=0;
while (i<=n) i=(i<<1);
i=(i>>1);
if (i==n) {if (aib[i]==a) return i; i=(i>>1);}
for (;i;i=(i>>1))
if (aib[sum+ub(i)]<=a) {a=a-aib[sum+ub(i)]; sum+=ub(i);}
if (a!=0) return -1;
return sum;
}
int main()
{
ios_base::sync_with_stdio(0);
in.tie();
out.tie();
in>>n>>m;
for (i=1;i<=n;++i)
{
in>>x;
update(i,x);
}
for (i=1;i<=m;++i)
{
in>>x>>a;
if (x==0) {in>>b; update(a,b);}
if (x==1) {in>>b; out<<query(b)-query(a-1)<<'\n';}
if (x==2) {out<<query2(a)<<'\n';}
}
return 0;
}