Pagini recente » Cod sursa (job #244712) | Cod sursa (job #1316039) | Cod sursa (job #157479) | Cod sursa (job #2125464) | Cod sursa (job #2786364)
#include <bits/stdc++.h>
using namespace std;
int n, m, tree[100001];
void make() {
for(int i = 1; i <= n; i++) {
int p = i + (i & -i);
if(p <= n)
tree[p] += tree[i];
}
}
int sum(int i) {
int suma = 0;
while(i > 0) {
suma += tree[i];
i -= i&-i;
}
return suma;
}
void add(int i, int x) {
while(i <= n) {
tree[i] += x;
i += i&-i;
}
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
cin>>n>>m;
for(int i = 1; i<=n; i++)
cin>>tree[i];
make();
int x, y;
for(; m; --m) {
short c; cin>>c;
if(c == 0) {
cin>>x>>y;
add(x, y);
}
if(c == 1) {
cin>>x>>y;
cout<<sum(y) - sum(x - 1)<<'\n';
}
if(c == 2) {
cin>>x;
int p = 0;
for(int pas = n/2; pas; pas/=2)
while(p + pas <= n && sum(p + pas) <= x)
p += pas;
if(sum(p) == x)
cout<<p<<'\n';
else
cout<<-1<<'\n';
}
}
return 0;
}