#include<bits/stdc++.h>

using namespace std;

#define int long long

vector<int>a,b;
int ans = 0;
int n,m,T;
vector<int>p;

struct node{
    int t,cnt,cnt_to,a,mod_t,mod_cnt,boil1,boil2;
};

vector<node>t;

void build(int v,int tl,int tr){
    if(tl==tr){
        if(p[tl]>=0){
            t[v] = {p[tl],p[tl]/a[tl]+tl,tl,a[tl],0,0,p[tl],1000000000000000ll};
        }else{
            t[v] = {p[tl],0,tl,a[tl],0,0,1000000000000000ll,-p[tl]};
        }
        return;
    }
    int md = (tl+tr)/2;
    build(v*2,tl,md);
    build(v*2+1,md+1,tr);
    t[v].cnt = max(t[v*2].cnt,t[v*2+1].cnt);
    t[v].boil1 = min(t[v*2].boil1,t[v*2+1].boil1);
    t[v].boil2 = min(t[v*2].boil2,t[v*2+1].boil2);
    if(t[v].cnt==t[v*2].cnt){
        t[v].a = t[v*2].a;
        t[v].t = t[v*2].t;
    }else{
        t[v].a = t[v*2+1].a;
        t[v].t = t[v*2+1].t;
    }
}

void push(int v){
    int x = t[v].mod_t;
    int y = t[v].mod_cnt;

    if(x>0){
        t[v*2].boil1+=x;
        t[v*2+1].boil1+=x;
    }else{
        t[v*2].boil2-=x;
        t[v*2].boil2-=x;
    }

    t[v*2].mod_cnt += y;
    t[v*2+1].mod_cnt += y;

    t[v*2].cnt_to+=y;
    t[v*2+1].cnt_to+=y;

    t[v*2].t+=x;
    t[v*2].cnt = t[v*2].t/t[v*2].a;
    if(t[v*2].t>=0){
        t[v*2].cnt+=t[v*2].cnt_to;
    }
    t[v*2].mod_t +=x;


    t[v*2+1].t+=x;
    t[v*2+1].cnt = t[v*2+1].t/t[v*2+1].a;
    if(t[v*2+1].t>=0){
        t[v*2+1].cnt+=t[v*2+1].cnt_to;
    }
    t[v*2+1].mod_t +=x;
    
    t[v].mod_cnt = 0;
    t[v].mod_t = 0;
}

int timer1 = 0,timer2 = 0;

void upd1(int v,int tl,int tr,int l,int r,int x,int y){
    if(tl>r||tr<l){
        return;
    }
    if(tl>=l&&tr<=r){
        t[v].t+=x;
        t[v].boil2 -= x;
        t[v].cnt_to+=y;
        t[v].cnt = t[v].t/t[v].a;
        if(t[v].t>=0){
            t[v].cnt+=t[v].cnt_to;
        }
        t[v].mod_cnt+=y;
        t[v].mod_t+=x;
        return;
    }
    push(v);

    int md = (tl+tr)/2;
    upd1(v*2,tl,md,l,r,x,y);
    upd1(v*2+1,md+1,tr,l,r,x,y);

    t[v].cnt = max(t[v*2].cnt,t[v*2+1].cnt);
    t[v].boil1 = min(t[v*2].boil1,t[v*2+1].boil1);
    t[v].boil2 = min(t[v*2].boil2,t[v*2+1].boil2);
    if(t[v].cnt==t[v*2].cnt){
        t[v].a = t[v*2].a;
        t[v].t = t[v*2].t;
        t[v].cnt_to = t[v*2].cnt_to;
    }else{
        t[v].a = t[v*2+1].a;
        t[v].t = t[v*2+1].t;
        t[v].cnt_to = t[v*2+1].cnt_to;
    }
}

void upd2(int v,int tl,int tr,int l,int r,int x,int y){
    if(tl>r||tr<l){
        return;
    }
    if(tl>=l&&tr<=r){
        t[v].t+=x;
        t[v].boil1+=x;
        t[v].cnt_to+=y;
        t[v].cnt = t[v].t/t[v].a;
        if(t[v].t>=0){
            t[v].cnt+=t[v].cnt_to;
        }
        t[v].mod_cnt+=y;
        t[v].mod_t+=x;
        return;
    }

    push(v);

    int md = (tl+tr)/2;
    upd2(v*2,tl,md,l,r,x,y);
    upd2(v*2+1,md+1,tr,l,r,x,y);

    t[v].cnt = max(t[v*2].cnt,t[v*2+1].cnt);
    t[v].boil2 = min(t[v*2].boil2,t[v*2+1].boil2);
    t[v].boil1 = min(t[v*2].boil1,t[v*2+1].boil1);
    if(t[v].cnt==t[v*2].cnt){
        t[v].a = t[v*2].a;
        t[v].t = t[v*2].t;
        t[v].cnt_to = t[v*2].cnt_to;
    }else{
        t[v].a = t[v*2+1].a;
        t[v].t = t[v*2+1].t;
        t[v].cnt_to = t[v*2+1].cnt_to;
    }
}

void upd_b(int v,int tl,int tr){
    if(t[v].boil1>timer1&&t[v].boil2>timer2){
        return;
    }
    if(tl==tr){
        if(t[v].boil2<=timer2){
            t[v].boil2 = 1e15;
            t[v].boil1 = t[v].t;
        }
        if(t[v].boil1<=timer1){
            t[v].boil1 = 1e15;
            t[v].boil2 = 1e15;
        }
        return;
    }
    push(v);

    int md = (tl+tr)/2;
    upd_b(v*2,tl,md);
    upd_b(v*2+1,md+1,tr);
    
    t[v].cnt = max(t[v*2].cnt,t[v*2+1].cnt);
    t[v].boil2 = min(t[v*2].boil2,t[v*2+1].boil2);
    t[v].boil1 = min(t[v*2].boil1,t[v*2+1].boil1);
    if(t[v].cnt==t[v*2].cnt){
        t[v].a = t[v*2].a;
        t[v].t = t[v*2].t;
        t[v].cnt_to = t[v*2].cnt_to;
    }else{
        t[v].a = t[v*2+1].a;
        t[v].t = t[v*2+1].t;
        t[v].cnt_to = t[v*2+1].cnt_to;
    }
}


signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m >> T;
    a.resize(n);
    b.resize(n);
    t.resize(4*n);
    p.resize(n);
    for(auto & it : a){
        cin>>it;
    }
    for(int i = 0; i < m; ++i){
        int x;
        cin>>x;
        x--;
        b[x]++;
    }
    int h = T;
    for(int i = 0; i < n;++i){
        p[i] = h;
        h-=a[i];
    }
    build(1,0,n-1);

    for(int i = 0; i < n; ++i){
        if(b[i]){
            ans = max(ans,t[1].cnt);
        }
        if(i+1<n){
        timer1+=a[i+1];
        timer2+=a[i];
        upd1(1,0,n-1,0,i,-a[i+1],1);
        upd2(1,0,n-1,i+1,n-1,a[i],-1);
        upd_b(1,0,n-1);
        }
    }
    cout<<ans;
}