Pagini recente » Cod sursa (job #2008806) | Cod sursa (job #2018825)
#include <fstream>
#include <cstdio>
#include <cmath>
#define DIM 355
#define VAL 100005
using namespace std;
struct Bucket
{
int be, en, nr;
};
Bucket B[DIM];
int N, M, i, j, op, a, b;
int v[VAL], rad, K;
void Update(int a, int b)
{
int i;
v[a]+=b;
for (i=1; i<=K; i++)
if (B[i].be<=a && a<=B[i].en)
break;
B[i].nr+=b;
}
int Sum_Query(int a, int b)
{
int i, S=0;
for (i=1; i<=K; i++)
{
if (a<=B[i].be && B[i].en<=b)
S+=B[i].nr;
else
{
if (B[i].be<=a && a<=B[i].en)
{
for (j=a; j<=min(b, B[i].en); j++)
S+=v[j];
}
else
if (B[i].be<=b && b<=B[i].en)
for (j=max(a, B[i].be); j<=b; j++)
S+=v[j];
}
}
return S;
}
int Position_Query(int a)
{
int i, j, S=0, P=-1;
for (i=1; i<=K; i++)
{
S+=B[i].nr;
if (S>=a)
break;
}
S-=B[i].nr;
for (j=B[i].be; j<=B[i].en; j++)
{
S+=v[j];
if (S==a)
{
P=j;
break;
}
}
return P;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &N, &M);
for (i=1; i<=N; i++)
scanf("%d", &v[i]);
rad=sqrt(N);
i=1;
while (i<=N)
{
B[++K].be=i;
B[K].en=min(i+rad-1, N);
for (j=B[K].be; j<=B[K].en; j++)
B[K].nr+=v[j];
i+=rad;
}
for (i=1; i<=M; i++)
{
scanf("%d %d", &op, &a);
if (op<2)
scanf("%d", &b);
if (op==0)
Update(a, b);
if (op==1)
printf("%d\n", Sum_Query(a, b));
if (op==2)
printf("%d\n", Position_Query(a));
}
return 0;
}