Pagini recente » Cod sursa (job #562234) | Cod sursa (job #1117550) | Cod sursa (job #2901482) | Cod sursa (job #1290289) | Cod sursa (job #2552129)
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,x,y,a,ai[1<<19];
void Build(int nod,int st,int dr)
{ if(st==dr)
{ f>>ai[nod];
return;
}
int mij=(st+dr)/2;
Build(2*nod,st,mij);
Build(2*nod+1,mij+1,dr);
ai[nod]=ai[2*nod]+ai[2*nod+1];
}
void Update(int nod,int st,int dr)
{ if(st==dr)
{ ai[nod]+=y;
return;
}
int mij=(st+dr)/2;
if(x<=mij)
Update(2*nod,st,mij);
if(mij<x)
Update(2*nod+1,mij+1,dr);
ai[nod]=ai[2*nod]+ai[2*nod+1];
}
int Query(int nod,int st,int dr)
{ if(st>=x && dr<=y)
return ai[nod];
int mij=(st+dr)/2,sumSt,sumDr;
sumSt=sumDr=0;
if(x<=mij)
sumSt=Query(2*nod,st,mij);
if(mij<y)
sumDr=Query(2*nod+1,mij+1,dr);
return sumSt+sumDr;
}
int CautBin()
{ int st=1,dr=n;
while(st<=dr)
{ int mij=(st+dr)/2;
x=1; y=mij;
int sum=Query(1,1,n);
if(sum==a)
return mij;
else
if(sum<a)
st=mij+1;
else
dr=mij-1;
}
return -1;
}
int main()
{ f>>n>>m;
Build(1,1,n);
for(int t; m; m--)
{ f>>t;
if(t==2)
{ f>>a;
g<<CautBin()<<'\n';
}
else
{ f>>x>>y;
if(!t)
Update(1,1,n);
else
g<<Query(1,1,n)<<'\n';
}
}
g.close(); f.close(); return 0;
}