Submission #1215030

#TimeUsernameProblemLanguageResultExecution timeMemory
1215030zfs732OGLEDALA (COI15_ogledala)C++20
100 / 100
1562 ms10632 KiB
//蒟蒻一枚 rp++
//即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难
//反之亦然同理,推论自然成立,略去过程Q.E.D.,由上可知证毕
#include<bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#define re register
#define il inline
#define gc() getchar()
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define repp(i,a,b) for(int i=(a);i<(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define tep(i,x) for(int i=head[x];~i;i=ne[i])
#define ls(x) x<<1
#define rs(x) x<<1|1
#define epos (1e-9)
#define inf 0x3f3f3f3f
#define INF 1e16
#define pii pair<int,int>
#define mp(i,j) make_pair(i,j)
#define pb push_back
#define fi first
#define sc second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
typedef double db;
namespace IO{
//	#define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<9,stdin),p1==p2)?EOF:*p1++)
//	char buf[1<<9],*p1=buf,*p2=buf;
	template<typename T> inline void read(T &x){
		bool f=1;x=0;char ch=gc();
		while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=gc();}
		while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch&15),ch=gc();
		x=f?x:-x;
	}
	template<typename T> inline void write(T x){
		if(x<0) putchar('-'),x=-x;
	   	if(x>9) write(x/10);
	   	putchar(char('0'+x%10));
	}
	template <typename T,typename ...Args> inline
	void read(T &x,Args &...args){read(x);read(args...);}
	template<typename T> inline void write(T x,char c){write(x),putchar(c);}
}
using namespace IO;
namespace MOD{
	typedef uint32_t u32;
	typedef uint64_t u64;
	typedef __uint128_t u128;
	u64 p,m;
	void set_mod(u32 mod){
		m=mod,p=-m/m+1;
	}
	u64 mo(u64 x){//取模优化
		x-=u64((u128)x*p>>64)*m;
		return (x>=m)?x-m:x;
	}
}
bool _ST;
#define int LL
const int N=1e5+100;
struct NODE{
    int len,pos,cnt1,cnt2,ori,type;
    NODE(int _len=0,int _pos=0,int _cnt1=0,int _cnt2=0,int _ori=0,int _type=0){
        len=_len,pos=_pos,cnt1=_cnt1,cnt2=_cnt2,ori=_ori,type=_type;
    }
    bool operator <(const NODE&T)const{
        return (len==T.len)?pos>T.pos:len<T.len;
    }
};
int n,q;
LL m,pos[N],a[N],ans[N];
priority_queue<NODE> que;
pii qu[N];
LL calc1(LL len,LL k,LL t){
    LL res=0;
    while(len>1){
        if(t<=(k>>1)) len>>=1,k>>=1;
        else res+=len>>1,len>>=1,t-=(k>>1),k=(k+1)>>1;
    }
    return res+1;
}
LL calc2(LL len,LL k,LL t){
    LL res=0;
    while(len>1){
        if(t<=len/2-(k>>1)) len>>=1,k>>=1;
        else res+=len>>1,t-=len/2-(k>>1),len>>=1,k=(k+1)>>1;
    }
    return res+1;
}
LL calc3(LL len,LL k,LL t){
    LL res=0;
    while(len>1){
        if(t<=len/2) len>>=1,k>>=1;
        else res+=k>>1,t-=len/2,len>>=1,k=(k+1)>>1;
    }
    return res+k;
}
bool _ED;
signed main(){
	fprintf(stderr,"%.20lf MB\n",(&_ST-&_ED)/1048576.0);
	//ios::sync_with_stdio(false);
	//cin.tie(0);cout.tie(0);

    read(m,n,q);
    rep(i,1,n) read(a[i]),pos[i]=a[i];
    sort(a+1,a+1+n);a[n+1]=m+1;
    rep(i,1,n+1) if(a[i]-a[i-1]-1>0) que.push(NODE(a[i]-a[i-1]-1,a[i-1]+1,1,0,1,0));

    rep(i,1,q) read(qu[i].fi),qu[i].sc=i;
    sort(qu+1,qu+q+1);

    int cur=1;
    while(cur<=q&&qu[cur].fi<=n) ans[qu[cur].sc]=pos[qu[cur].fi],++cur;

    LL ti=n;
    while(!que.empty()&&cur<=q){
        auto u=que.top();que.pop();
        if(!u.len) break;
        LL ed=ti+u.cnt1;
        //cerr<<ti<<" "<<ed<<endl;
        if(u.type==2) ed+=u.cnt2;

        while(cur<=q&&qu[cur].fi<=ed){
            if(u.type==0){
                LL res=calc1(u.ori,u.cnt1,qu[cur].fi-ti);
                ans[qu[cur].sc]=u.pos+(qu[cur].fi-ti-1)*(u.len+1)+(res-(qu[cur].fi-ti))*u.len+(u.len-1)/2;
            }
            else if(u.type==1){
                LL res=calc2(u.ori,u.cnt2,qu[cur].fi-ti);
                ans[qu[cur].sc]=u.pos+(qu[cur].fi-ti-1)*(u.len+1)+(res-(qu[cur].fi-ti))*(u.len+2)+(u.len-1)/2;
            }
            else{//1
                LL res=calc3(u.ori,u.cnt1,qu[cur].fi-ti);
                ans[qu[cur].sc]=u.pos+2ll*(qu[cur].fi-ti-1)+res;
            }
            ++cur;
        }

        ti=ed;

        if(u.type==0){
            if(u.len==2){

                que.push(NODE(1,u.pos,u.cnt1,u.cnt2,u.ori,2));
            }
            else{
                que.push(NODE(u.len-1,u.pos,u.cnt2,u.cnt1,u.ori,1));
            }
        }
        if(u.type==1){
            int cnt1,cnt2;
            if(u.len%2==0) cnt1=u.cnt1+u.cnt2*2,cnt2=u.cnt1;//0->00,1->01
            else cnt1=u.cnt2,cnt2=u.cnt1*2+u.cnt2;
            que.push(NODE((u.len+1)/2,u.pos,cnt1,cnt2,u.ori*2ll,0));
        }
    }
    rep(i,1,q) write(ans[i],'\n');
	fprintf(stderr,"%.4lf s\n",1.0*clock()/CLOCKS_PER_SEC);
	return 0;
}
// ./seat < seat3.in > seat.out
//谨记:
//十年OI一场空,不开longlong见祖宗
//数据千万条,清空第一条。多测不清空,爆零两行泪。清空不规范,TLE总相伴。
//快读要加类型名
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...