Pagini recente » Cod sursa (job #2801890) | Cod sursa (job #1604493) | Cod sursa (job #1769925) | Cod sursa (job #3239189) | Cod sursa (job #222519)
Cod sursa(job #222519)
#include <cstdio>
#include <vector>
using namespace std;
int A[200000];
int N, M;
inline int LST (int x) {return x & (-x);}
inline int MST (int x)
{
int nr=0;
while (x>>1)
{
x>>=1;
nr++;
}
return 1<<nr;
}
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, int start, int stop)
{
if (S<0) return start;
if (start>stop) return start;
int x=MST (stop);
if (A[start+x]>S)
return query2 (S, start, stop/2);
else
return query2 (S-A[start], start+x, stop);
}
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);
}
for (int i=0; i<M; ++i)
{
scanf ("%d", &c);
if (c==2)
{
scanf ("%d", &x);
printf ("%d\n", query2 (x, 0, N-1));
}
else
{
scanf ("%d %d", &x, &y);
if (!c) update (x,y);
else printf ("%d\n", (query (y)-query (x-1)));
}
}
return 0;
}