Pagini recente » Cod sursa (job #2623713) | Cod sursa (job #2507002) | Cod sursa (job #1328975) | Cod sursa (job #1465085) | Cod sursa (job #1066259)
#include<fstream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<queue>
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define abs(x) (x>0?x:-x)
#define ll long long
using namespace std;
ifstream in("kami.in");
ofstream out("kami.out");
const int Nmax = 100005;
int v[Nmax];
int N,M;
const int size = 1<<16;
char buff[size];
int bit=size;
bool cifra(char &x){
return ('0'<=x && x<='9');
}
void reload(){
if(bit>=size){in.read(buff,size);bit=0;}
}
void Read(int &x){
reload();
while(!cifra(buff[bit])){
bit++;
reload();
}
x=0;
while(cifra(buff[bit])){
x=x*10 + int(buff[bit])-'0';
bit++;
reload();
}
}
struct AintElem{
ll need,val;
} A[20*Nmax];
int wh;
void Update(int i,int st,int dr){
if( st==dr ){
A[i].need=v[wh];
A[i].val=v[wh];
}
else{
int mij=(st+dr)/2;
if(wh<=mij) Update(2*i,st,mij);
if(wh>mij) Update(2*i+1,mij+1,dr);
A[i].need=max( A[2*i].need-A[2*i+1].val , A[2*i+1].need );
A[i].val=A[2*i].val+A[2*i+1].val;
}
}
void update(int &i,int &val){
//Aib.update(i,val);
v[i]=val;
wh=i;
Update(1,1,N);
}
ll val;
int Query(int i,int st,int dr,int x){
if( dr==x ){
if(val>A[i].need){
val+=A[i].val;
return 0;
}
if(st==dr) return st;
}
int mij=(st+dr)/2;
if(x<=mij) return Query(2*i,st,mij,x);
else{
int Right = Query(2*i+1,mij+1,dr,x);
if(Right) return Right;
else return Query(2*i,st,mij,mij);
}
}
int query(int &x){
if(x==1) return 0;
val=v[x];
return Query(1,1,N,x-1);
}
int main(){
Read(N);
for(int i=1;i<=N;i++){
int x;
Read(x);
update(i,x);
}
Read(M);
for(int i=1;i<=M;i++){
int c,x,y;
Read(c);
if(c==0){
Read(x);
Read(y);
update(x,y);
}
if(c==1){
Read(x);
out<<query(x)<<'\n';
}
}
return 0;
}