Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98085 | alex_liu | 早凉的程序2 | C++ | 解答错误 | 0 | 4000 MS | 15872 KB | 1981 | 2023-08-14 11:59:14 |
#include<bits/stdc++.h> #define int long long using namespace std; inline int read(){ int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } int n,m,p,a[1000005],sum[1000005],flaga=1,flagb=1,flagc=1,flagd=1; signed main(){ n=read(),m=read(),p=read(); for(int i=1;i<=n;i++){ a[i]=read();sum[i]=sum[i-1]+a[i]; if(a[i]>=p||a[i]<0)flaga=0; if(a[i]<p)flagb=0; if(i^1){ if(a[i-1]>a[i])flagc=0; if(a[i-1]<a[i])flagd=0; } } cout<<flaga<<" "<<flagb<<" "<<flagc<<" "<<flagd<<endl; for(int i=1,l,r;i<=m;i++){ l=read(),r=read(); if(flaga)printf("%lld\n",(sum[r]-sum[l-1])%p); else if(flagb)printf("%lld\n",sum[r]-sum[l-1]-(r-l+1)*p); else if(flagc){ if(a[r]<=p){ int ans=sum[r]-sum[l-1]; if(ans<0)printf("%lld\n",ans); else printf("%lld\n",ans%p); } else{ int pos=upper_bound(a+l+1,a+r+1,p)-a,ans=0;//找到第一个>p的位置 // cout<<pos<<endl; ans=(sum[pos-1]-sum[l-1]); if(ans>=p)ans%=p;//≤p的处理完 if(ans<0){ if(ans+sum[r]-sum[pos-1]<0)printf("%lld\n",ans+sum[r]-sum[pos-1]); else{ int ll=pos,rr=r; while(ll^rr){ int mid=ll+rr>>1; if(sum[mid]-sum[pos-1]+ans<p)ll=mid+1; else rr=mid; } // cout<<ll-1<<endl; if(ll==r){ ans+=a[r]; printf("%lld\n",ans-p); continue; } ans+=sum[ll-1]-sum[pos-1]; printf("%lld\n",ans+(sum[r]-sum[ll-1])-(r-ll+1)*p); } }else printf("%lld\n",(ans%p)+(sum[r]-sum[pos-1])-(r-pos+1)*p); } } // else if(flagd){ // int ll=l,rr=r; // while(ll^rr){//第一个<p的数 // int mid=ll+rr>>1; // if(a[mid]<p)rr=mid; // else ll=mid+1; // } // // } else{ int ans=0; for(int j=l;j<=r;j++){ ans+=a[j]; if(ans>=p)ans-=p; } printf("%lld\n",ans); } } return 0; }