标签:
描述
#include<iostream> #include<cstdio> using namespace std; struct node{ int s,t,l,r; }tr[800001]; int n,q; int a[200001]; int read() { char c=getchar(); int a=0; while (c<‘0‘||c>‘9‘) c=getchar(); while (c>=‘0‘&&c<=‘9‘) { a=a*10+c-‘0‘; c=getchar(); } return a; } void build(int k,int x,int y) { tr[k].s=x; tr[k].t=y; if (x==y) { tr[k].l=tr[k].r=0; return; } int mid=(x+y)>>1; build(k<<1,x,mid); build(k<<1|1,mid+1,y); return; } void insertl(int now,int x,int y) { int l=tr[now].s,r=tr[now].t; //if (y if (x==l && y==r) { tr[now].l+=1; return; } int mid=(l+r)>>1; if (x>mid) insertl(now<<1|1,x,y); else if (y<=mid) insertl(now<<1,x,y); else { insertl(now<<1,x,mid); insertl(now<<1|1,mid+1,y); } return; } void insertr(int now,int x,int y) { int l=tr[now].s,r=tr[now].t; //if (y if (x==l && y==r) { tr[now].r+=1; return; } int mid=(l+r)>>1; if (x>mid) insertr(now<<1|1,x,y); else if (y<=mid) insertr(now<<1,x,y); else { insertr(now<<1,x,mid); insertr(now<<1|1,mid+1,y); } return; } int findl(int k,int x) { int l=tr[k].s,r=tr[k].t; //if (y if (l==r) return tr[k].l; int mid=(l+r)>>1; if (x<=mid) return tr[k].l+findl(k<<1,x); else return tr[k].l+findl(k<<1|1,x); } int findr(int k,int x) { int l=tr[k].l,r=tr[k].r; if (l==r) return tr[k].r; int mid=(l+r)>>1; if (x<=mid) return tr[k].r+findr(k<<1,x); else return tr[k].r+findr(k<<1|1,x); } int main() { int total=0; n=read(); build(1,0,n); q=read(); for (int i=1; i<=q; i++) { int now=read(); int x=read(),y=read(); if (now==1) { insertl(1,0,x-1); insertr(1,y+1,n); total++; } else if (now==2) { int ans1=findr(1,x); int ans2=findl(1,y); int ans=ans1+ans2; //cout << ans1 << ‘ ‘ << ans2 << "hh" << endl; printf("%lld\n",total-ans); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/Shymuel/p/4393581.html