Pagini recente » Cod sursa (job #2371351) | Cod sursa (job #2337851) | Cod sursa (job #2303186) | Cod sursa (job #2466061) | Cod sursa (job #1167422)
#include<cstdio>
using namespace std;
const int NMAX = 100000+5;
void Read(),Solve();
int N,M;
int AIB[NMAX];
void Update(int i,int value)
{
for(; i <= N; i += i&(-i))
AIB[i] += value;
}
int Query(int i)
{
int ans = 0;
for(; i >= 1; i -= i&(-i))
ans += AIB[i];
return ans;
}
int BS(int sum)
{
int left,right,middle;
for(left = 1, right = N; left <= right; )
{
middle = (left + right)/2;
if(Query(middle) < sum) left = middle+1;
else if(Query(middle) > sum) right = middle;
else return middle;
}
return -1;
}
int main()
{
Read();
Solve();
return 0;
}
void Read()
{
int i,x;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&N,&M);
for(i = 1; i <= N; i++)
{
scanf("%d",&x);
Update(i,x);
}
}
void Solve()
{
int t,a,b;
for(; M; --M)
{
scanf("%d",&t);
if(t == 0)
{
scanf("%d%d",&a,&b);
Update(a,b);
}
if(t == 1)
{
scanf("%d%d",&a,&b);
printf("%d\n",Query(b)-Query(a-1));
}
if(t == 2)
{
scanf("%d",&a);
printf("%d\n",BS(a));
}
}
}