Pagini recente » Cod sursa (job #1371429) | Cod sursa (job #3176351) | Cod sursa (job #1773788) | Cod sursa (job #1132130) | Cod sursa (job #431983)
Cod sursa(job #431983)
#include<fstream>
#include<cstdio>
#define maxn 100001
using namespace std;
ifstream fin("aib.in");
int n,m,poz;
int c[maxn];
void modifica(int ind,int val)
{ poz=0;
while(ind<=n)
{ c[ind]+=val;
while(!(ind & (1<<poz)))
poz++;
ind+=(1<<poz);
poz++;
}
}
int suma(int ind)
{ int s=0;
poz=0;
while(ind>0)
{ s+=c[ind];
while(!(ind &(1<<poz)))
poz++;
ind-=(1<<poz);
poz+=1;
}
return s;
}
int cauta(int sum)
{ int ind=n+1,b=n,lst=0,ldr=n+1,s;
s=suma(b);
if(s==sum) ind=n;
while(b)
{ b=(lst+ldr)>>1;
s=suma(b);
if(s>sum)
{ if(ldr>b) ldr=b;
b--;
}
else if(s==sum){ ind=min(ind,b);
ldr=b;
b--;
}
else
{ if(lst<b) lst=b;
b++;
}
if(b<=lst) break;
if(b>=ldr) break;
}
if(ind==n+1) return -1;
return ind;
}
int main()
{ freopen("aib.in","w",stdout);
int i,x,y,k;
fin>>n>>m;
for(i=1;i<=n;i++)
{ fin>>x;
modifica(i,x);
}
for(i=1;i<=m;i++)
{ fin>>k;
if(k!=2)
{ fin>>x>>y;
if(k==1) printf("%d\n",suma(y)-suma(x-1));
else modifica(x,y);
}
else
{ fin>>x;
printf("%d\n",cauta(x));
}
}
fin.close();
fclose(stdout);
return 0;
}