Pagini recente » Cod sursa (job #3254471) | Cod sursa (job #1707621) | Cod sursa (job #2222831) | Cod sursa (job #2143869) | Cod sursa (job #2961138)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
typedef long long ll;
const int MAXN=150010;
int n,q;
ll aib[MAXN];
void Update (int pos, int val){
for (int i=pos;i<=n;i+=(i&(-i)))
aib[i]+=val;
}
long long Suma (int pos){
long long rez=0;
for (int i=pos;i>=1;i-=(i&(-i))){
rez+=aib[i];
}
return rez;
}
int Solve (int val){
int s=0,rez=0;
for (int i=25;i>=0;--i){
if (rez+(1<<i)<=n and s+aib[rez+(1<<i)]<val){
s+=aib[rez+(1<<i)];
rez+=(1<<i);
}
}
rez++;
if (rez>n or Suma (rez)!=val)
return -1;
return rez;
}
int main()
{
fin >>n>>q;
for (int i=1;i<=n;++i){
int x;
fin >>x;
Update (i,x);
}
for (int i=1;i<=q;++i){
int tip;
fin >>tip;
if (tip==0){
int a,b;
fin >>a>>b;
Update (a,b);
/*fout <<'\n';
for (int j=1;j<=n;++j){
fout <<aib[j]<<' ';
}
fout <<'\n';*/
}
else{
if (tip==1){
int a,b;
fin >>a>>b;
fout <<Suma (b)-Suma (a-1)<<'\n';
}
else{
int x;
fin >>x;
fout <<Solve (x)<<'\n';
}
}
}
fin.close ();
fout.close ();
return 0;
}