这道题要用unsigned long long.不然会WA一个点.数据有点SXBK.
/* I will wait for you */ #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<iostream> #include<fstream> #include<vector> #include<queue> #include<deque> #include<set> #include<map> #include<string> typedef long long LL; typedef unsigned long long ULL; using namespace std; const int maxn=300010; const int maxm=210; const int maxs=26; const int INF=1<<29; const int P=1000000007; const double error=1e-9; struct edge {int v,next; }e[maxn]; int cnt=0,n,m,k; int he[maxn],be[maxn],u[maxn],v[maxn],wi[maxn],ans[maxn],q[maxn],q1[maxn],q2[maxn]; ULL tem[maxn],cur[maxn],xu[maxn],s[maxn]; void ins(int u,int v) { e[cnt]=(edge){v,he[u]};he[u]=cnt++; } void add(int x,ULL c) { for(;x<=m;x+=x&(-x)) s[x]+=c; } ULL sum(int x) { ULL ans=0;for(;x;x-=x&(-x)) ans+=s[x];return ans; } void slove(int head,int tail,int l,int r) { if(head>tail) return; int mid=(l+r)/2; for(int i=l;i<=mid;i++) { if(u[i]<=v[i]) add(u[i],wi[i]),add(v[i]+1,-wi[i]); else add(1,wi[i]),add(v[i]+1,-wi[i]),add(u[i],wi[i]); } for(int i=head;i<=tail;i++) { int u=q[i];tem[i]=0; for(int j=he[u];j!=-1;j=e[j].next) tem[i]+=sum(e[j].v); } for(int i=l;i<=mid;i++) { if(u[i]<=v[i]) add(u[i],-wi[i]),add(v[i]+1,wi[i]); else add(1,-wi[i]),add(v[i]+1,wi[i]),add(u[i],-wi[i]); } if(l==r) for(int i=head;i<=tail;i++) ans[q[i]]=cur[q[i]]+tem[i]>=xu[q[i]]?l:0; else { int a=0,b=0; for(int i=head;i<=tail;i++) { if(tem[i]+cur[q[i]]>=xu[q[i]]) q1[a++]=q[i]; else q2[b++]=q[i],cur[q[i]]+=tem[i]; } for(int i=0;i<a;i++) q[head+i]=q1[i]; for(int i=0;i<b;i++) q[head+a+i]=q2[i]; slove(head,head+a-1,l,mid); slove(head+a,tail,mid+1,r); } } int main() { scanf("%d%d",&n,&m); memset(he,-1,sizeof(he)); for(int i=1;i<=m;i++) scanf("%d",&be[i]),ins(be[i],i); for(int i=1;i<=n;i++) scanf("%llu",&xu[i]); scanf("%d",&k); for(int i=1;i<=k;i++) scanf("%d%d%d",&u[i],&v[i],&wi[i]); for(int i=1;i<=n;i++) q[i]=i;slove(1,n,1,k); for(int i=1;i<=n;i++) ans[i]?printf("%d\n",ans[i]):printf("NIE\n"); return 0; }