J
线段树赋值更新维护最大值
常数级优化同等T下X不同取最大X
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct Node{
int t,x;
}a[N],b[N];
bool cmp(Node a,Node b){
if(a.t==b.t) return a.x>b.x;
return a.t>b.t;
}
const int maxn=1e5+5;
int tree[maxn*4];
int lazy[maxn*4];
struct node{
int l,r;
int sum,lazy;
}t[N<<2];
void init()
{
memset(tree,0,sizeof(tree));
}
void pushdown(int t)
{
if(tree[t]==0)return ;
tree[t<<1]=max(tree[t<<1],tree[t]);
tree[t<<1|1]=max(tree[t<<1|1],tree[t]);
}
void update(int l,int r,int t,int L,int R,int d)
{
if(L>r||R<l)
return;
if(l>=L&&r<=R)
{
tree[t]=max(tree[t],d);
}
else
{
pushdown(t);
int mid=(l+r)>>1;
if(mid>=L)
update(l,mid,t<<1,L,R,d);
if(mid<R)
update(mid+1,r,t<<1|1,L,R,d);
}
}
int query(int l,int r,int t,int L,int R)
{
if(l>=L&&r<=R)
return tree[t];
if(l>R||r<L)
return 0;
int mid =(l+r)>>1;
pushdown(t);
if(mid>=L)
return query(l,mid,t<<1,L,R);
if(mid<R)
return query(mid+1,r,t<<1|1,L,R);
}
signed main(){
int T;scanf("%d",&T);int ca=0;
while(T--){
int n,m;scanf("%d%d",&n,&m);
init();
for(int i=1;i<=n;++i){
int t,x;
scanf("%d",&b[i].t);
scanf("%d",&b[i].x);
}
sort(b+1,b+n+1,cmp);
int cnt=1;
a[1]=b[1];
for(int i=2;i<=n;i++) if(b[i].t!=a[cnt].t){
a[++cnt]=b[i];
}
for(int i=1;i<=cnt;i++){
for(int k=0;;++k){
int l=2*k*a[i].t+1;
int r=2*k*a[i].t+a[i].t;
r=min(r,m);
if(l<=m && r<=m)update(1,m,1,l,r,a[i].x);
if(l>=m || r==m) break;
}
}
printf("Case #%d:",++ca);
for(int i=1;i<=m;++i) printf(" %d",query(1,m,1,i,i));
puts("");
}
return 0;
}