Pagini recente » Cod sursa (job #1156076) | Cod sursa (job #1839792) | Cod sursa (job #823980) | Cod sursa (job #1446856) | Cod sursa (job #642275)
Cod sursa(job #642275)
#include <cstdio>
#define NMax 100005
using namespace std;
int N, AIB[NMax];
inline int Z (int X)
{
return (X&(-X));
}
void Update (int X, int V)
{
for (int i=X; i<=N; i+=Z (i))
{
AIB[i]+=V;
}
}
int Query (int X)
{
int S=0;
for (int i=X; i>0; i-=Z (i))
{
S+=AIB[i];
}
return S;
}
int Search(int V)
{
int Step;
for (Step=1; Step<N; Step<<=1);
for(int i=0; Step; Step>>=1)
{
if (i+Step<=N)
{
if(V>=AIB[i+Step])
{
i+=Step;
V-=AIB[i];
if (V==0)
{
return i;
}
}
}
}
return -1;
}
int main()
{
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
int M;
scanf ("%d %d", &N, &M);
for (int i=1; i<=N; ++i)
{
int A;
scanf ("%d", &A);
Update (i, A);
}
for (; M>0; --M)
{
int Type, X, Y;
scanf ("%d %d", &Type, &X);
if (Type==0)
{
scanf ("%d", &Y);
Update (X, Y);
}
if (Type==1)
{
scanf ("%d", &Y);
printf ("%d\n", Query (Y)-Query (X-1));
}
if (Type==2)
{
printf ("%d\n", Search (X));
}
}
return 0;
}