比較水的分快,還不會爆LL
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
typedef long long LL;
const int MAXN = 100009;//點數的最大值
const int MAXM = 1000010;//邊數的最大值
const LL INF = 1152921504;
typedef struct cao{
LL num;
int point;
bool operator < (const cao &a)const
{
return num<a.num;
}
};
bool cmp(cao a,cao b)
{
return a.point<b.point;
}
struct node
{
cao p[600];
int num;
void init()
{
num=0;
}
void Sort(){
sort(p,p+num);
}
void rSort(){
sort(p,p+num,cmp);
}
int query(int now,LL orz,int rt)
{
int ans=0;
if(now==-1)
{
cao o;
o.num=orz;
ans=lower_bound(p,p+num,o)-p;
return ans;
}
if(rt==0)
{
for(int i=0;i<num;i++)
if(p[i].point>=now&&p[i].num<orz)
ans++;
}
else{
for(int i=0;i<num;i++)
if(p[i].point<=now&&p[i].num<orz)
ans++;
}
return ans;
}
void change(int q,LL val)
{
for(int i=0;i<num;i++)
{
if(q==p[i].point)
{
p[i].num=val;
Sort();
return ;
}
}
}
}block[600];
int main()
{
int n,m,l,r,p;
LL u,v;
while(scanf("%d%d%lld",&n,&m,&u)!=EOF)
{
int len=sqrt(n),lnum=0;
for(int i=0;i<=len+1;i++)
block[i].init();
for(int i=0;i<n;i++)
{
block[lnum].p[block[lnum].num].point=i;
scanf("%lld",&block[lnum].p[block[lnum].num++].num);
if(block[lnum].num>=len&&(i!=n-1))
lnum++;
}
for(int i=0;i<=lnum;i++)
block[i].Sort();
while(m--)
{
scanf("%d%d%lld%d",&l,&r,&v,&p);
l--,r--,p--;
int x=l/len;
int y=r/len;
int k=block[x].query(l,v,0);
if(x!=y) k+=block[y].query(r,v,1);
for(int i=x+1;i<y;i++)
{
k+=block[i].query(-1,v,0);
}
x=p/len;
LL val=(u*(LL)k)/(LL)(r-l+1);
block[x].change(p,val);
}
for(int i=0;i<=lnum;i++)
{
block[i].rSort();
for(int j=0;j<block[i].num;j++)
printf("%lld\n",block[i].p[j].num);
}
}
return 0;
}
/*
*/