Pagini recente » Borderou de evaluare (job #3153043) | Cod sursa (job #3278471) | Borderou de evaluare (job #2752007) | Cod sursa (job #2412278) | Cod sursa (job #1970342)
#include<cstdio>
using namespace std;
const int NMAX = 100000;
const int MMAX = 150000;
int n, m;
int aib[1 + 2 * NMAX];
int val;
void update(int pos, int val)
{
for(;pos <= n; pos += (pos & (-pos)))
{
aib[pos] += val;
}
}
int querry(int pos)
{
int s = 0;
for(;pos > 0; pos -= (pos & (-pos)))
{
s += aib[pos];
}
return s;
}
int querry2(int s)
{
int temp = val;
int i = 0;
while(temp != 0)
{
if(i + temp <= n && s >= aib[i + temp])
{
s -= aib[i + temp];
i += temp;
if(s == 0)
{
return i;
}
}
temp >>= 1;
}
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
val = 1;
while(val <= n)
{
val <<= 1;
}
val >>= 1;
int t, x, y;
for(int i = 1; i <= n; i++)
{
scanf("%d", &x);
update(i, x);
}
int output;
for(int i = 1; i <= m; i++)
{
scanf("%d", &t);
if(t == 0)
{
scanf("%d %d", &x, &y);
update(x, y);
}
else if(t == 1)
{
scanf("%d %d", &x, &y);
output = querry(y) - querry(x - 1);
printf("%d\n", output);
}
else
{
scanf("%d", &x);
output = querry2(x);
printf("%d\n", output);
}
}
}