Pagini recente » Cod sursa (job #527965) | Cod sursa (job #1633794) | Cod sursa (job #1583098) | Cod sursa (job #636373) | Cod sursa (job #2549397)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX=100010;
int n,m;
int v[NMAX];
int arb[5*NMAX];
struct INTERVAL{
int st,dr;
}interval[5*NMAX];
void citire()
{
fin>>n>>m;
for (int i=1; i<=n; i++)
fin>>v[i];
}
void construireArbore(int rad, int st, int dr)
{
if (st==dr){
interval[rad].st=st;
interval[rad].dr=dr;
arb[rad]=v[st];
}else{
int mij=(st+dr)/2;
interval[rad].st=st;
interval[rad].dr=dr;
construireArbore(2*rad,st,mij);
construireArbore(2*rad+1,mij+1,dr);
arb[rad]=arb[2*rad]+arb[2*rad+1];
}
}
void update(int rad, int a, int b)
{
if (interval[rad].st==interval[rad].dr && interval[rad].st==a){
arb[rad]+=b;
v[a]+=b;
}else if (interval[rad].st<=a && interval[rad].dr>=a){
update(2*rad,a,b);
update(2*rad+1,a,b);
arb[rad]=arb[2*rad]+arb[2*rad+1];
}
}
int query(int rad, int st, int dr)
{
if (interval[rad].st>=st && interval[rad].dr<=dr){
return arb[rad];
}else if (interval[rad].st>dr || interval[rad].dr<st){
return 0;
}else{
return query(2*rad,st,dr)+query(2*rad+1,st,dr);
}
}
int tipul2(int a)
{
int st=1,dr=n;
int q,mij;
while (st<=dr){
mij=(st+dr)/2;
q=query(1,1,mij);
if (q<a){
st=mij+1;
}else if (q>a){
dr=mij-1;
}else{
return mij;
}
}
return -1;
}
void rezolvare()
{
int a,b,c;
for (int i=1; i<=m; i++){
fin>>c>>a;
if (c<2)
fin>>b;
switch (c){
case 0:
update(1,a,b);
break;
case 1:
fout<<query(1,a,b)<<'\n';
break;
case 2:
fout<<tipul2(a)<<'\n';
break;
}
}
}
void BFS(int rad)
{
queue<int>q;
q.push(rad);
int k;
while (!q.empty()){
k=q.front();
q.pop();
if (interval[k].st!=0){
fout<<interval[k].st<<' '<<interval[k].dr<<' '<<arb[k]<<'\n';
q.push(2*k);
q.push(2*k+1);
}
}
}
int main()
{
citire();
construireArbore(1,1,n);
rezolvare();
//BFS(1);
fin.close();
fout.close();
return 0;
}