这题有个坑点就是y<10时是需要乘10的
思路:线段树按日分区间维护,同时多记录一些变量即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const int N=1000009;
const ll INF=2e18;
struct Node{
ll l,r;
ll d;//当前天数区间的最小值
ll f;//懒标记的最小值
ll id1,id2;//分别是当前区间天数最小值编号与懒标记编号
}t[N<<2];
int n,m,q;
ll k;
ll a[N];
ll Min;
ll cnt;
ll read(){
char ch;
ll ans=0;
ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
return ans;
}
void check(int y,int x){
if(t[y].d>t[x].f){
t[y].d=t[x].f;
t[y].id1=t[x].id2;
t[y].id2=t[x].id2;
t[y].f=t[x].f;
}
else if(t[y].d==t[x].f){
t[y].id1=min(t[y].id1,t[x].id2);
if(t[x].f<t[y].f){
t[y].id2=t[x].id2;
t[y].f=t[x].f;
}
else if(t[x].f==t[y].f)t[y].id2=min(t[y].id2,t[x].id2);
}
else{
if(t[x].f<t[y].f){
t[y].f=t[x].f;
t[y].id2=t[x].id2;
}
else if(t[x].f==t[y].f){
t[y].id2=min(t[y].id2,t[x].id2);
}
}
}
void spread(ll p){
if(t[p].f<INF){
check(p<<1,p);
check(p<<1|1,p);
t[p].f=INF;
t[p].id2=INF;
}
}
void build(ll p,ll l,ll r){
t[p].l=l,t[p].r=r;
t[p].f=INF;
t[p].id1=k;
t[p].id2=INF;
if(l==r){
t[p].d=Min;
return;
}
int mid=(l+r)/2;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p].d=Min;
}
void change(ll p,ll l,ll r,ll v,ll x){
if(l<=t[p].l&&r>=t[p].r){
if(t[p].d>v){
t[p].d=v;
t[p].id1=x;
t[p].id2=x;
t[p].f=v;
}
else if(t[p].d<v){
if(v<t[p].f){
t[p].id2=x;
t[p].f=v;
}
else if(v==t[p].f)t[p].id2=min(t[p].id2,x);
}
else{
t[p].id1=min(t[p].id1,x);
if(v<t[p].f){
t[p].id2=x;
t[p].f=v;
}
else if(v==t[p].f)t[p].id2=min(t[p].id2,x);
}
return;
}
spread(p);
ll mid=(t[p].l+t[p].r)/2;
if(l<=mid)change(p<<1,l,r,v,x);
if(r>mid)change(p<<1|1,l,r,v,x);
if(t[p<<1].d>t[p<<1|1].d)t[p].id1=t[p<<1|1].id1;
else if(t[p<<1].d<t[p<<1|1].d)t[p].id1=t[p<<1].id1;
else t[p].id1=min(t[p<<1].id1,t[p<<1|1].id1);
t[p].d=min(t[p<<1].d,t[p<<1|1].d);
}
ll ask(ll p,ll l,ll r){
if(t[p].l==t[p].r){
cnt=t[p].id1;
return t[p].id1;
}
spread(p);
ll mid=(t[p].l+t[p].r)/2;
ll k1=INF,k2=INF;
if(l<=mid)k1=ask(p<<1,l,r);
if(r>mid)k2=ask(p<<1|1,l,r);
if(t[p<<1].d<t[p<<1|1].d)t[p].id1=t[p<<1].id1;
else if(t[p<<1].d>t[p<<1|1].d)t[p].id1=t[p<<1|1].id1;
else t[p].id1=min(t[p<<1].id1,t[p<<1|1].id1);
t[p].d=min(t[p<<1].d,t[p<<1|1].d);
return t[p].id1;
}
int main()
{
Min=INF;
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++){
a[i]=read();
if(Min>a[i]){Min=a[i],k=i;}
}
build(1,1,m);
while(q--){
ll x,y,l,r;
x=read(),y=read(),l=read(),r=read();
if(y<10)y*=10;
ll tmp=a[x]*y/(100*1ll);
change(1,l,r,tmp,x);
}
for(int i=1;i<=m;i++){
ask(1,i,i);
printf("%lld ",cnt);
}
return 0;
}