Pagini recente » Cod sursa (job #3230716) | Cod sursa (job #1931315) | Cod sursa (job #1816349) | Cod sursa (job #2313361) | Cod sursa (job #2331455)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int v[100001],a[100001],n,m;
int op,r,b,x;
void citire(){
f>>n>>m;
for(int i=1;i<=n;i++)
f>>v[i];
}
void formare(){
for(int i=1;i<=n;i++){
int k=i-(i&(-i))+1;
for(int j=k;j<=i;j++) a[i]+=v[j];
}}
void op0(int i,int x)
{
while(i<=n){
a[i]+=x;
i=i+(i&(-i));
}
}
int suma(int i){
int sol=0;
while(i>0){
sol+=a[i];
i=i-(i&(-i));
}
return sol;
}
int op1(int val)
{
int i, step;
for (step = 1; step <= n; step <<= 1);
for (i = 1; step; step >>= 1)
if (i + step <=n && suma(i + step) <= val)
i += step;
if(suma(i)==val) return i;
else return -1;
}
int op2(int a, int b){
int r=suma(b)-suma(a-1);
return r;
}
int main()
{
citire();
formare();
for(int i=1;i<=m;i++){
f>>op;
if(op==0){
f>>r>>b; op0(r,b);
}
if(op==2)
{f>>r; g<<op1(r)<<endl;}
if(op==1) {f>>r>>b; g<<op2(r,b)<<endl;}
}
return 0;
}