Pagini recente » Cod sursa (job #457840) | Cod sursa (job #457836) | Cod sursa (job #2438545) | Cod sursa (job #1180375) | Cod sursa (job #1208271)
#include <fstream>
using namespace std;
int A[200001];
int n, m, a, b, i, t, x;
int query(int p) {
int r = 0;
for (;p;p -= (p&-p) )
r += A[p];
return r;
}
void update(int p, int x) { // adaug x la pozitia p
for (;p<=n;p += (p&-p))
A[p] += x;
}
int search(int a) {
// caut cea mai din stg pozitie k pentru care suma de la 1 la k este a
int p = 1, st = 1;
while (2*p <= n)
p*=2;
for (;p;p/=2) {
if (A[st + p - 1] <= a) {
a -= A[st + p - 1];
if (a == 0)
return st+p-1;
st += p;
}
}
return -1;
}
int main (){
ifstream fin("aib.in");
ofstream fout("aib.out");
fin>>n>>m;
for (i=1;i<=n;i++) {
fin>>x;
update (i, x);
}
for (i=1;i<=m;i++) {
fin>>t;
if (t == 0) {
fin>>a>>b;
update(a, b);
} else
if (t == 1) {
fin>>a>>b;
fout<<query(b) - query(a-1)<<"\n";
} else {
fin>>a;
fout<<search(a)<<"\n";
}
}
return 0;
}