Pagini recente » Cod sursa (job #1765641) | Cod sursa (job #3166787) | Cod sursa (job #2316070) | Cod sursa (job #2767637) | Cod sursa (job #1766754)
#include <cstdio>
using namespace std;
long long aib[1000010],n;
long long query(long long p) {
long long rez=0,pow2;
while (p!=0) {
rez+=aib[p];
pow2=(p&(-p));
p-=pow2;
}
return rez;
}
void update(long long p,long long val) {
int pow2;
while (p<=n) {
aib[p]+=val;
pow2=(p&(-p));
p+=pow2;
}
}
long long search1(long long val) {
long long i=0,pas=1<<16;
while (pas!=0) {
if (i+pas<=n && aib[i+pas]<=val) {
i+=pas;
val-=aib[i];
}
pas/=2;
}
if (val==0)
return i;
else
return -1;
}
int main()
{
FILE *fin,*fout;
long long m,i,a,t,b;
fin=fopen("aib.in","r");
fout=fopen("aib.out","w");
fscanf(fin,"%lld%lld", &n, &m);
for (i=1;i<=n;i++) {
fscanf(fin,"%d", &a);
update(i,a);
}
for (i=1;i<=m;i++) {
fscanf(fin,"%lld%lld", &t, &a);
if (t<2)
fscanf(fin,"%lld", &b);
if (t==0)
update(a,b);
if (t==1)
fprintf(fout,"%lld\n", query(b)-query(a-1));
if (t==2)
fprintf(fout,"%lld\n", search1(a));
}
return 0;
}