Pagini recente » Cod sursa (job #1245951) | Cod sursa (job #2056472) | Cod sursa (job #2187514) | Cod sursa (job #1550092) | Cod sursa (job #1602314)
#include <iostream>
#include <fstream>
#define lim 100000
#define len(x) (x&(-x))
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,aib[100005];
void Update(int x,int val)
{ int i;
for(i=x;i<=lim;i+=len(i))
aib[i]+=val;
}
int Query(int x)
{ int i,res=0;
for(i=x;i>0;i-=len(i))
res+=aib[i];
return res;
}
int Search(int sum)
{ int i,act=0,num=0;
for(i=16;i>=0;i--)
if (((num|(1<<i))<=n) && act+aib[num|(1<<i)]<=sum)
{ num|=(1<<i);
act+=aib[num];
}
if (act==sum && num>0) return num;
return -1;
}
int main()
{ int i,x,y,t;
f>>n>>m;
for(i=1;i<=n;i++)
{ f>>x;Update(i,x); }
for(i=1;i<=m;i++)
{
f>>t;
if (t==0) { f>>x>>y; Update(x,y); }
if (t==1) { f>>x>>y; g<<Query(y)-Query(x-1)<<"\n"; }
if (t==2) { f>>x; g<<Search(x)<<"\n"; }
}
return 0;
}