Pagini recente » Profil KappaClaus | Cod sursa (job #1473325) | Cod sursa (job #2003062) | Cod sursa (job #697488) | Cod sursa (job #222521)
Cod sursa(job #222521)
#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 -1;
int x=MST (stop-start);
if (A[start+x]>S)
return query2 (S, start, start+x-1);
else
return query2 (S-A[start+x], 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);
if (!x) printf ("-1\n");
else printf ("%d\n", query2 (x, 0, N));
}
else
{
scanf ("%d %d", &x, &y);
if (!c) update (x,y);
else printf ("%d\n", (query (y)-query (x-1)));
}
}
return 0;
}