Pagini recente » Cod sursa (job #1123389) | Cod sursa (job #2323705) | Cod sursa (job #2176503) | Cod sursa (job #1856470) | Cod sursa (job #2874874)
#include <fstream>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
#define MAX 100001
int N;
struct aib{
int v[MAX];
aib(){
for(int i = 1; i <= N; i++) v[i] = 0;
}
void update(int p, int x){
for(int i = p; i <= N; i += (i & (-i))){
v[i] += x;
}
}
int sum(int p){
int ans = 0;
for(int i = p; i > 0; i -= (i&(-i))){
ans += v[i];
}
return ans;
}
};
int main(){
aib x;
int M;
in >> N >> M;
for(int i = 1; i <= N; i++)
{
int val;
in >> val;
x.update(i, val);
}
for(int i = 1; i <= M; i++)
{
int a, b, c;
in >> c;
if(c == 0)
{
in >> a >> b;
x.update(a, b);
}
if(c == 1)
{
in >> a >> b;
out << x.sum(b) - x.sum(a-1) << endl;
}
if(c == 2)
{
int st, dr, ans = 0;
in >> a;
st = 1;
dr = N;
while(st <= dr){
int m = (st + dr) / 2;
if(x.sum(m) <= a){
st = m + 1;
ans = m;
}
else
dr = m - 1;
}
if(x.sum(ans) == a)
out << ans << endl;
else
out << "-1" << endl;
}
}
return 0;
}