Pagini recente » Cod sursa (job #105351) | Cod sursa (job #1112721) | Cod sursa (job #1904360) | Cod sursa (job #2262332) | Cod sursa (job #2570323)
#include <bits/stdc++.h>
#define zeros(x) ((x^(x-1))&x)
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n,m,x,y,op,lg;
int aib[100005];
void add(int p,int x)
{
for(int i=p;i<=n;i+=zeros(i))
aib[i]+=x;
}
int query(int p)
{
int ans=0;
for(int i=p;i>0;i-=zeros(i))
ans+=aib[i];
return ans;
}
int cauta(int x)
{
if(x==0) return -1;
int poz=0;
for(int bit=(1<<lg);bit>=1;bit>>=1)
if(poz+bit<=n&&aib[poz+bit]<=x)
{
x-=aib[poz+bit];
poz+=bit;
}
if(x==0) return poz;
else return -1;
}
int main()
{
in>>n>>m;
for(int i=1;i<=n;i++) {
in>>x;
add(i,x);
}
lg=log2(n);
while(m--)
{
in>>op>>x;
if(op==0||op==1) in>>y;
if(op==0) add(x,y);
if(op==1) out<<query(y)-query(x-1)<<'\n';
if(op==2) out<<cauta(x)<<'\n';
}
return 0;
}