开O2 77pts求卡常(莫队+树状数组)
查看原帖
开O2 77pts求卡常(莫队+树状数组)
75765
Starlight237楼主2020/8/1 11:54
#include<bits/stdc++.h>
using namespace std;
#define reg register
const int N = 100001;
#define lowbit(x) ((x) & -(x))
#define IOSIZE 1000000
extern "C"{
namespace io{
	static char in[IOSIZE],*p=in,*pp=in,out[IOSIZE],*q=out,ch[20],*t=ch;
	inline char gc(){return p==pp&&(pp=(p=in)+fread(in,1,IOSIZE,stdin),p==pp)?EOF:*p++;}
	inline int read(){
		reg int x=0;reg char ch,f=0;
		while(!isdigit(ch=gc()))f|=ch=='-';
		while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=gc();
		return f?-x:x;
	}
	inline void write(int x,char sp){
		!x&&(*q++=48),x<0&&(*q++='-',x=-x);
		while(x)*t++=x%10+48,x/=10;
		while(t!=ch)*q++=*--t;
		*q++=sp;
	}
	inline void flush(){fwrite(out,1,q-out,stdout);}
}}
#define read io::read
#define write io::write
int tr1[N], tr2[N];
inline void add(int x, int v, int *tr) {
	for (; x <= N; x += lowbit(x)) tr[x] += v;
}
inline int query(int x, int *tr) {
	reg int sm = 0; 
	for (; x; x -= lowbit(x)) sm += tr[x]; 
	return sm;
}
int n, m, bl[N], a[N], cnt[N], res1[N], res2[N];
struct Node{
    int l, r, a, b, i;
}qry[N];
inline bool cmp(const Node&a, const Node&b) {
    return bl[a.l] != bl[b.r] ? bl[a.l] < bl[b.l] : bl[a.l] & 1 ? a.r > b.r : a.r < b.r;
}
inline void ins(int x) {
	add(a[x], 1, tr1);
	(++cnt[a[x]] == 1) && (add(a[x], 1, tr2), 0);
}
inline void del(int x) {
	add(a[x], -1, tr1); 
	(--cnt[a[x]] == 0) && (add(a[x], -1, tr2), 0);}
int main() {
    n = read(), m = read();
    int bsiz = pow(n*2, 1.0 / 3);
    for (reg int i = 1; i <= n; ++i) bl[i] = (i - 1) / bsiz + 1;
    for (reg int i = 1; i <= n; ++i) a[i] = read();
    for (reg int i = 1; i <= m; ++i)
        qry[i].l = read(), qry[i].r = read(), qry[i].a = read(), qry[i].b = read(), qry[i].i = i;
    sort(qry + 1, qry + m + 1, cmp);
    reg int l = 1, r = 0;
    for (reg int i = 1; i <= m; ++i) {
        for (; r < qry[i].r; ins(++r));
        for (; l > qry[i].l; ins(--l));
        for (; r > qry[i].r; del(r--));
        for (; l < qry[i].l; del(l++));
        res1[qry[i].i] = query(qry[i].b, tr1) - query(qry[i].a - 1, tr1);
        res2[qry[i].i] = query(qry[i].b, tr2) - query(qry[i].a - 1, tr2);
    }
    for (reg int i = 1; i <= m; ++i)
        write(res1[i],' '),  write(res2[i],'\n');
    io :: flush();
    return 0;
}
2020/8/1 11:54
加载中...