这题有个坑点就是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;
}