传送门
最直观的想法是维护N个元素每个时间的状态.这个做法显然不切实际,但似乎在线去做又没有什么很好的办法,所以只能考虑离线.
离线做法:因为只有单点查询,所以我们可以按照每个修改和询问的位置排序.然后只维护每个时间点的状态.修改可以拆分成两个操作,在l位置上修改time-m的值,在r+1位置撤销这次修改.然后离线的一个一个处理询问就可以了.而询问可以转化成1-time-1有多少个数>=y-a[pos].这个可以用分块来处理.对每个块排序然后跨块的时候二分就可以了.
#define LL long long
#define pq priority_queue
#define ULL unsigned long long
#define pb push_back
#define mem(a,x) memset(a,x,sizeof a)
#define pii pair<int,int>
#define fir(i,a,b) for(int i=a;i<=(int)b;++i)
#define afir(i,a,b) for(int i=(int)a;i>=b;--i)
#define ft first
#define vi vector<int>
#define sd second
#define ALL(a) a.begin(),a.end()
#define bug puts("-------")
#define mpr(a,b) make_pair(a,b)
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
inline void read(int &a){
int x = 0,f=1;char ch = getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){
x=x*10+ch-'0';ch=getchar();}
a = x*f;
}
struct C{
int p,x,tim;
}c[N];
struct Q{
int p,x,tim,id;
}q[N];
int n,m,blo,num,L[N],R[N],pos[N],a[N],ans[N],siz[N];
LL t[N],v[N],tag[N];
void build(){
int n = m+1;
blo = sqrt(n);
num = n/blo;
fir