Pagini recente » Cod sursa (job #1496819) | Cod sursa (job #1870415) | Cod sursa (job #1461397) | Cod sursa (job #477511) | Cod sursa (job #3166916)
#include <array>
#include <iostream>
#include <chrono>
#include <fstream>
constexpr long long nmax = 100000;
long long aib[nmax + 5];
long long n;
long long ub(int x){
return (x & (-x));
}
void add(long long x, int y)
{
for(long long i = x; i <= n; i += ub(i)) {
aib[i] += y;
}
}
long long sum(int x){
long long rez = 0;
for(long long i = x; i >= 1; i -= ub(i)){
rez += aib[i];
}
return rez;
}
int main() {
auto start = std::chrono::high_resolution_clock::now();
std::ifstream in("aib.in");
std::ofstream out("aib.out");
long long m;
in >> n >> m;
for(long long i = 1; i <= n; i++){
long long x;
in >> x;
add(i, x);
}
for(long long i = 0; i < m; i++) {
long long op, a, b;
in >> op >> a;
if(op == 0){
in >> b;
add(a, b);
}else if(op == 1){
in >> b;
out << sum(b) - sum(a-1) << "\n";
}else {
long long st = 0, dr = n;
long long mij = st + (dr - st)/ 2;
long long minval = n + 1;
while(st <= dr){
if(sum(mij) == a){
if(mij < minval) minval = mij;
else break;
}
if(sum(mij) <= a){
st = mij + 1;
}else {
dr = mij - 1;
}
mij = st + (dr-st)/2;
}
if(minval == n+1) minval = -1;
out << minval << "\n";
}
}
auto stop = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
std::cout << duration.count() / 1000.0f << " milliseconds" << std::endl;
}