Pagini recente » Istoria paginii runda/cerc_info_avram2/clasament | Cod sursa (job #1279231) | Cod sursa (job #1738607) | Cod sursa (job #1702471) | Cod sursa (job #1004232)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
long long bit[100001],n;
long long RightmostOne(long long x) {
return x&(-x);
}
/*
void BIT_Gen() {
for(long long i = 1; i <= n; ++i) {
for(long long j = i - RightmostOne(i) + 1; j <= i; j++) {
//cerr << i;
bit[i]+=v[j];
}
}
}
*/
void BIT_Add(long long idx, long long val) {
for(long long i = idx; i <= n; i+=RightmostOne(i)) {
//cerr << i;
bit[i]+=val;
}
}
long long BIT_Compute(long long idx) {
long long res = 0;
for(long long i = idx; i > 0; i-=RightmostOne(i)) {
res+=bit[i];
}
return res;
}
long long BIT_Find(long long val) {
long long step = 1;
for(;step<n;step<<=1);
step>>=1;
long long i;
for(i = step; step!=0;step>>=1) {
if(i>=n){
i-=step;
continue;
}
long long currV = BIT_Compute(i+1);
if(currV == val)return i+1;
if(currV > val)i-=step;
if(currV < val)i+=step;
}
if(BIT_Compute(i+1)==val)return i+1;
return -1;
}
int main() {
long long m;
in >> n >> m;
for (long long i = 1; i <= n; ++i) {
long long t;
in >> t;
BIT_Add(i,t);
}
for(long long i = 0; i < m; ++i) {
long long c;
in >> c;
switch(c) {
case 0:
long long i,val;
in >> i >> val;
BIT_Add(i,val);
break;
case 1:
long long st,fn;
in >> st >> fn;
out << BIT_Compute(fn)-BIT_Compute(st-1) << '\n';
break;
case 2:
long long k;
in >> k;
out << BIT_Find(k)<<'\n';
break;
}
}
return 0;
}