Pagini recente » Cod sursa (job #320950) | Cod sursa (job #1520994) | Cod sursa (job #2029299) | Cod sursa (job #2752994) | Cod sursa (job #222524)
Cod sursa(job #222524)
#include <cstdio>
int A[200000];
int N, M, logN=1;
inline int LST (int x) {return x & (-x);}
void update (int x, int y)
{
for (int i=x; i<=N; i+= LST(i))
A[i]+= y;
}
int query (int x)
{
int S=0;
for (int i=x; i>0; i-= LST(i))
S+=A[i];
return S;
}
int query2 (int S)
{
if (!S) return -1;
int i=0;
for (int step=logN; step; step>>=1)
if (i+step<=N && A[i+step]<=S)
{
i+=step;
S-=A[i];
}
if (!S) return i;
else return -1;
}
int main()
{
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
int c, x, y;
scanf ("%d%d", &N, &M);
for (int i=1; i<=N; ++i)
{
scanf ("%d", &c);
update (i,c);
}
while (logN<=N/2)logN<<=1;
while (M--)
{
scanf ("%d", &c);
if (c==2)
{
scanf ("%d", &x);
printf ("%d\n", query2 (x));
}
else
{
scanf ("%d %d", &x, &y);
if (!c) update (x,y);
else printf ("%d\n", (query (y)-query (x-1)));
}
}
return 0;
}