Pagini recente » Cod sursa (job #3287355) | Cod sursa (job #1052986) | Cod sursa (job #2569937) | Cod sursa (job #998522) | Cod sursa (job #1228815)
#include <iostream>
#include <fstream>
#define MAXN 100000
#define LOG 16
using namespace std;
int aib[MAXN+1];
int n;
void update(int poz, int val) {
while (poz <= n) {
aib[poz] += val;
poz += (poz & (-poz));
}
}
long long query(int poz) {
long long s = 0;
while (poz > 0) {
s += aib[poz];
poz -= (poz & (-poz));
}
return s;
}
int search(int a) {
int poz = 0, pas = 1 << LOG;
while (pas) {
int p = poz + pas;
if (p <= n && query(p) < a)
poz = p;
pas >>= 1;
}
if (query(poz) == a)
return poz;
if (poz < n && query(poz + 1) == a)
return poz + 1;
return -1;
}
int main () {
ifstream cin("aib.in");
ofstream cout("aib.out");
int m;
cin >> n >> m;
for (int i = 0 ; i < n ; ++i) {
int x;
cin >> x;
update(i + 1, x);
}
for (int i = 0 ; i < m ; ++i) {
int tip, a, b;
cin >> tip;
switch(tip) {
case 0:
cin >> a >> b;
update(a, b);
break;
case 1:
cin >> a >> b;
cout << query(b) - query(a - 1) << "\n";
break;
case 2:
cin >> a;
cout << search(a) << "\n";
break;
}
}
cin.close();
cout.close();
return 0;
}