Pagini recente » Cod sursa (job #2618741) | Cod sursa (job #1526212) | Cod sursa (job #2284280) | Cod sursa (job #2892612) | Cod sursa (job #1882430)
#include <bits/stdc++.h>
#define zero(x) x&(-x)
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int NMax = 100002;
const int INF = 0x3f3f3f3f;
int n,m,x,y,c,p;
int AIB[NMax];
void upd(int ind,int v){
for(int i = ind; i <= n; i += zero(i))
AIB[i] += v;
}
int sum(int x){
int s = 0;
for(int i = x; i >= 1; i -= zero(i))
s += AIB[i];
return s;
}
int main()
{
f >> n >> m;
for(int i = 1; i <= n; ++i){
f >> x;
upd(i,x);
}
for(int i = 1; i <= m; ++i){
f >> p;
if(p == 0){
f >> x >> y;
upd(x, y);
}
if(p == 1){
f >> x >> y;
g << sum(y) - sum(x - 1) << '\n';
}
if(p == 2){
f >> x;
int lo = 1, hi = n,mid,ans;
while(lo <= hi){
mid = (lo + hi) / 2;
int sum1 = sum(mid), sum2 = sum(mid - 1);
if(sum1 >= x && sum2 < x)
ans = mid;
if(sum1 >= x)
hi = mid - 1;
if(sum2 < x)
lo = mid + 1;
}
if(sum(ans) != x){
g << -1 << '\n';
}else
g << mid << '\n';
}
}
return 0;
}