Pagini recente » Cod sursa (job #1369120) | Cod sursa (job #1273684) | Cod sursa (job #1177037) | summer-challenge-21/solutii/portale | Cod sursa (job #3290580)
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX = 1e5 + 5;
int aib[NMAX], n, m, i;
void update(int poz, int val) {
for(int i = poz; i <= n; i += (i&-i))
aib[i] += val;
}
int query(int a) {
if(!a) return 0;
int suma = 0;
for(int i = a; i > 0; i-=(i&-i))
suma+=aib[i];
return suma;
}
int findK(int s) {
int st = 1;
int dr = n;
int ret = 0;
while (st <= dr) {
int mid = 1LL*(st + dr) / 2;
int val = query(mid);
if (val > s)
dr = mid - 1;
else if (val < s)
st = mid + 1;
else
return mid;
}
return -1;
}
int main()
{
in >> n >> m;
for(i = 1; i <= n; ++i) {
int x;
in >> x;
update(i,x);
}
while(m--){
int t;
in >> t;
if(!t){
int a, b;
in >> a >> b;
update(a,b);
}
else if(t==1){
int a, b;
in >> a >> b;
out << query(b) - query(a-1) << '\n';
}
else {
int a;
in >> a;
out << findK(a) << '\n';
}
}
return 0;
}