Pagini recente » Cod sursa (job #1565534) | Cod sursa (job #2231348) | Cod sursa (job #2407904) | Cod sursa (job #2613576) | Cod sursa (job #1165603)
#include <cstdio>
#include <vector>
using namespace std;
class AIB{
public:
AIB(const int _n=0):
n(_n),
aib(vector<int>(n+1, 0)){}
void update(int i, const int val)
{
for(;i<=n;i+=lbs(i)) aib[i]+=val;
}
int operator[](int i) const
{
int ret=0;
for(;i>0;i-=lbs(i)) ret+=aib[i];
return ret;
}
int search(int s)
{
int i, step;
for(step=1;step<n;step<<=1);
for(i=0;step;step>>=1)
{
if(i+step<=n&&aib[i+step]<=s)
{
i+=step;
s-=aib[i];
}
}
if(s) return -1;
return i;
}
private:
int n;
vector<int> aib;
static int lbs(int x) {return x&(-x);}
};
AIB a;
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int n, q, i, x, y;
scanf("%d%d", &n, &q);
a=AIB(n);
for(i=1;i<=n;i++)
{
scanf("%d", &x);
a.update(i, x);
}
while(q--)
{
scanf("%d", &i);
if(i==0)
{
scanf("%d%d", &x, &y);
a.update(x, y);
}
else if(i==1)
{
scanf("%d%d", &x, &y);
printf("%d\n", a[y]-a[x-1]);
}
else
{
scanf("%d", &x);
printf("%d\n", a.search(x));
}
}
}