94pts 求调
查看原帖
94pts 求调
750524
Tmbcan楼主2025/1/3 20:31
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<climits>
#include<cstdlib>
#include<queue>
#include<cmath>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T>
inline void read(T&x){
	int w = 0;x = 0;
	char ch = getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-') w = 1;
		ch = getchar();
	}
	while(ch>='0' && ch<='9'){
		x = (x<<1)+(x<<3)+(ch^48);
		ch = getchar();
	}
	if(w) x = ~x+1;
}
template <typename T,typename...Args>
inline void read(T&t,Args&...args){
	read(t);read(args...);
}
template <typename T>
inline T Min(T x,T y){ return (x < y ? x : y); }
template <typename T>
inline T Max(T x,T y){ return (x > y ? x : y); }
const int N = 3e5+10;
const ll INF = 1e17;
int n,m,ans[N];
struct{
	ll num; int id;
}q[N],p1[N],p2[N];
struct{
	int l,r; ll w;
}g[N];
vector <int> o[N];
ll tr[N<<1];
inline void add(int x,ll k){
	for(int i=x;i<=(m<<1);i+=(i&(~i+1))) tr[i] += k; 
}
inline ll query(int x){
	ll res = 0;
	for(int i=x;i;i-=(i&(~i+1))) res += tr[i];
	return res;
}
inline ll check(int x){
	ll res = 0;
	for(int i=o[q[x].id].size()-1;i>=0;--i){
		res += query(o[q[x].id][i])+query(o[q[x].id][i]+m);
	}
	return res;
}
inline void solve(int l,int r,int L,int R){
	if(L>R) return ;
	if(l>=r){
		for(int i=L;i<=R;++i) ans[q[i].id] = l;
		return ;
	}
	int mid = (l+r)>>1;
	for(int i=l;i<=mid;++i) add(g[i].l,g[i].w),add(g[i].r+1,-1ll*g[i].w);
	int top1 = 0,top2 = 0;
	for(int i=L;i<=R;++i){
		ll tmp = check(i);
		if(tmp>=q[i].num) p1[++top1] = q[i];
		else{
			q[i].num -= tmp;
			p2[++top2] = q[i];
		}
	} 
	for(int i=L;i<=L+top1-1;++i) q[i] = p1[i-L+1];
	for(int i=L+top1;i<=R;++i) q[i] = p2[i-L-top1+1];
	for(int i=l;i<=mid;++i) add(g[i].l,-1ll*g[i].w),add(g[i].r+1,g[i].w);
	solve(l,mid,L,L+top1-1);
	solve(mid+1,r,L+top1,R);
}
int main(){
	//freopen("in.in","r",stdin);
    //freopen("out.out","w",stdout);
	
	read(n,m);
	for(int i=1,x;i<=m;++i){
		read(x);
		o[x].push_back(i);
	}
	for(int i=1;i<=n;++i){
		read(q[i].num);
		q[i].id = i;
	}
	int T;read(T);
	for(int i=1;i<=T;++i){
		read(g[i].l,g[i].r,g[i].w);
		if(g[i].l>g[i].r) g[i].r += m;
	}
	g[++T] = {1,m<<1,INF};
	solve(1,T,1,n);
	for(int i=1;i<=n;++i) (ans[i]==T) ? puts("NIE") : printf("%d\n",ans[i]);
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}

2025/1/3 20:31
加载中...