Cod sursa(job #1066259)

Utilizator teoionescuIonescu Teodor teoionescu Data 24 decembrie 2013 13:17:45
Problema Infasuratoare convexa Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#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;
}