Pagini recente » Cod sursa (job #2644433) | Cod sursa (job #1309760) | Cod sursa (job #143998) | Cod sursa (job #2823276) | Cod sursa (job #779601)
Cod sursa(job #779601)
#include <fstream>
#define MAXN 100005
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
long n,m,x,y,v[MAXN],nr0,tip,S1,S,st,dr,mij;
void adauga(long a,long b);
void suma(long a);
int main()
{
int i,j;
f>>n>>m;
for(i=1;i<=n;i++){
f>>x;
for(j=i;j<=n;j+=(1<<nr0)){
for(nr0=1;!(j%(1<<nr0));nr0++);
nr0--;
v[j]+=x;}}
for(i=1;i<=m;i++){
f>>tip;
if(!tip){
f>>x>>y;
adauga(y,x);
continue;}
if(tip==1){
f>>x>>y;
suma(y);
S1=S;
suma(x-1);
g<<S1-S<<'\n';}
else{
f>>x;
if(!x){
g<<"0\n";
continue;}
st=1;
dr=n;
while(st<dr){
mij=(st+dr)/2;
suma(mij);
if(S==x)
break;
if(S<x)
st=mij+1;
else
dr=mij-1;}
if(S==x)
g<<mij<<'\n';
else{
suma(st);
if(S==x)
g<<st<<'\n';
else
g<<"-1\n";}}}
f.close();
g.close();
return 0;
}
void adauga(long a,long b){
for(b;b<=n;b+=(1<<nr0)){
for(nr0=1;!(b%(1<<nr0));nr0++);
nr0--;
v[b]+=a;}}
void suma(long a){
S=0;
for(a;a>0;a-=(1<<nr0)){
for(nr0=1;!(a%(1<<nr0));nr0++);
nr0--;
S+=v[a];}}