线性逆元
点击查看代码
const int mod=1e9+7;
int jc[200005],iv[200005],ij[200005];
int C(int n,int m){
if(n<0||m<0||n-m<0)return 0;
return jc[n]*ij[m]%mod*ij[n-m]%mod;
}
jc[0]=1;for(int i=1;i<=n;i++)jc[i]=jc[i-1]*i%mod;
iv[1]=1;for(int i=2;i<=n;i++)iv[i]=mod-(mod/i)*iv[mod%i]%mod;
ij[0]=1;for(int i=1;i<=n;i++)ij[i]=ij[i-1]*iv[i]%mod;
segment tree
点击查看代码
struct segtree{
#define ls p<<1
#define rs p<<1|1
#define lson l,mid,ls
#define rson mid+1,r,rs
struct Node{
int s,mx,mn,tag;
}c[800005];
void pushup(int p){
c[p].s=c[ls].s+c[rs].s;
c[p].mx=max(c[ls].mx,c[rs].mx);
c[p].mn=min(c[ls].mn,c[rs].mn);
}
void pushdown(int l,int r,int p){
if(!c[p].tag)return;
int siz=r-l+1,ln=siz-(siz>>1),rn=siz>>1;
c[ls].s+=ln*c[p].tag,c[rs].s+=rn*c[p].tag;
c[ls].mx+=c[p].tag,c[rs].mx+=c[p].tag;
c[ls].mn+=c[p].tag,c[rs].mn+=c[p].tag;
c[ls].tag+=c[p].tag,c[rs].tag+=c[p].tag;
c[p].tag=0;
}
void build(int l,int r,int p){
if(l==r){c[p].s=c[p].mx=c[p].mn=a[l];return;}
int mid=(l+r)>>1;
build(lson),build(rson);
pushup(p);
}
void update1(int l,int r,int p,int x,int k){
if(l==r){c[p].s=c[p].mx=c[p].mn=k;return;}
int mid=(l+r)>>1;pushdown(l,r,p);
if(x<=mid)update1(lson,x,k);
else update1(rson,x,k);
pushup(p);
}
void update2(int l,int r,int p,int L,int R,int k){
if(L<=l&&r<=R){c[p].s+=(r-l+1)*k,c[p].mx+=k,c[p].mn+=k,c[p].tag+=k;return;}
int mid=(l+r)>>1;pushdown(l,r,p);
if(L<=mid)update2(lson,L,R,k);
if(R>mid)update2(rson,L,R,k);
pushup(p);
}
int query1(int l,int r,int p,int L,int R){
if(L<=l&&r<=R)return c[p].s;
int mid=(l+r)>>1,res=0;pushdown(l,r,p);
if(L<=mid)res+=query1(lson,L,R);
if(R>mid)res+=query1(rson,L,R);
return res;
}
int query2(int l,int r,int p,int L,int R){
if(L<=l&&r<=R)return c[p].mx;
int mid=(l+r)>>1,res=-inf;pushdown(l,r,p);
if(L<=mid)res=max(res,query2(lson,L,R));
if(R>mid)res=max(res,query2(rson,L,R));
return res;
}
int query3(int l,int r,int p,int L,int R){
if(L<=l&&r<=R)return c[p].mn;
int mid=(l+r)>>1,res=inf;pushdown(l,r,p);
if(L<=mid)res=min(res,query3(lson,L,R));
if(R>mid)res=min(res,query3(rson,L,R));
return res;
}
#undef ls
#undef rs
#undef lson
#undef rson
}Tr;
lca
点击查看代码
struct edge{
int v,nxt;
}e[300005];
int tot,head[300005];
void add(int u,int v){
e[++tot]=(edge){v,head[u]},head[u]=tot;
}
int pa[500005][25],dep[500005];
void dfs(int u,int fa){
dep[u]=dep[fa]+1,pa[u][0]=fa;
for(int i=0;i<=22;i++)pa[u][i+1]=pa[pa[u][i]][i];
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;if(v==fa)continue;
dfs(v,u);
}
}
int getlca(int x,int y){
if(dep[x]>dep[y])swap(x,y);
for(int i=22;i>=0&&dep[x]!=dep[y];i--)if(dep[y]-dep[x]>=(1<<i))y=pa[y][i];
if(x==y)return x;
for(int i=22;i>=0;i--)if(pa[x][i]!=pa[y][i])x=pa[x][i],y=pa[y][i];
return pa[x][0];
}
dijkstra
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define mk make_pair
#define fi first
#define se second
using namespace std;
typedef pair<int,int>pii;
const int inf=1e18;
struct edge{
int v,w,nxt;
}e[200005];
int tot,head[200005];
void add(int u,int v,int w){
e[++tot]=(edge){v,w,head[u]},head[u]=tot;
}
int d[200005],vis[200005];
void dijkstra(int s){
for(int i=1;i<=n;i++)d[i]=inf,vis[i]=0;
priority_queue<pii,vector<pii>,greater<pii> >q;
d[s]=0;q.push(mk(d[s],s));
while(!q.empty()){
int u=q.top().se;q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(d[v]>d[u]+w)d[v]=d[u]+w,q.push(mk(d[v],v));
}
}
}
BIT
点击查看代码
struct BIT{
int c[200005];
void add(int x,int y){
for(;x<=n;x+=x&-x)c[x]+=y;
}
int ask(int x){
int res=0;
for(;x;x-=x&-x)res+=c[x];
return res;
}
}Tr;
struct BIT{
int c1[100005],c2[100005];
void add(int x,int v){
int y=x;
for(;x<=n;x+=x&-x)c1[x]+=v,c2[x]-=y*v;
}
void add(int l,int r,int v){
add(l,v),add(r+1,-v);
}
int ask(int x){
int res=0,y=x;
for(;x;x-=x&-x)res+=(y+1)*c1[x]+c2[x];
return res;
}
int ask(int l,int r){
return ask(r)-ask(l-1);
}
}Tr;
struct BIT{
int c[4][2050][2050];
void add(int x,int y,int k){
for(int i=x;i<=n;i+=i&-i)for(int j=y;j<=m;j+=j&-j){
c[0][i][j]+=k,c[1][i][j]+=x*k,c[2][i][j]+=y*k,c[3][i][j]+=x*y*k;
}
}
void add(int x1,int y1,int x2,int y2,int v){
add(x1,y1,v),add(x2+1,y1,-v),add(x1,y2+1,-v),add(x2+1,y2+1,v);
}
int ask(int x,int y){
int res=0;
for(int i=x;i;i-=i&-i)for(int j=y;j;j-=j&-j){
res+=(x+1)*(y+1)*c[0][i][j]-(y+1)*c[1][i][j]-(x+1)*c[2][i][j]+c[3][i][j];
}
return res;
}
int ask(int x1,int y1,int x2,int y2){
return ask(x2,y2)-ask(x2,y1-1)-ask(x1-1,y2)+ask(x1-1,y1-1);
}
}Tr;
树剖
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
struct edge{
int v,nxt;
}e[400005];
int head[200005],tot;
void add(int u,int v){
e[++tot]=(edge){v,head[u]},head[u]=tot;
}
int siz[200005],son[200005],pa[200005],dep[200005];
void dfs1(int u,int fa){
siz[u]=1,son[u]=0,pa[u]=fa,dep[u]=dep[fa]+1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;if(v==fa)continue;
dfs1(v,u);siz[u]+=siz[v];
if(siz[son[u]]<siz[v])son[u]=v;
}
}
int cur,dfn[200005],rnk[200005],top[200005];
void dfs2(int u,int rt){
top[u]=rt,dfn[u]=++cur,rnk[cur]=u;
if(son[u])dfs2(son[u],rt);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;if(v==pa[u])continue;
if(v!=son[u])dfs2(v,v);
}
}
int n,m,root,P,a[200005];
struct segtree{
#define ls p<<1
#define rs p<<1|1
#define lson l,mid,ls
#define rson mid+1,r,rs
struct Node{
int s,tag;
}c[800005];
void pushup(int p){
c[p].s=(c[ls].s+c[rs].s)%P;
}
void pushdown(int l,int r,int p){
if(c[p].tag==0)return;
int siz=r-l+1,ln=siz-(siz>>1),rn=siz>>1;
c[ls].s=(c[ls].s+ln*c[p].tag)%P,c[rs].s=(c[rs].s+rn*c[p].tag)%P;
c[ls].tag=(c[ls].tag+c[p].tag)%P,c[rs].tag=(c[rs].tag+c[p].tag)%P;
c[p].tag=0;
}
void build(int l,int r,int p){
if(l==r){
c[p]=(Node){a[rnk[l]],0};
return;
}
int mid=(l+r)>>1;
build(lson),build(rson);
pushup(p);
}
void update(int l,int r,int p,int L,int R,int k){
if(L<=l&&r<=R){
c[p].s=(c[p].s+(r-l+1)*k%P)%P;
c[p].tag=(c[p].tag+k)%P;
return;
}
int mid=(l+r)>>1;pushdown(l,r,p);
if(L<=mid)update(lson,L,R,k);
if(R>mid)update(rson,L,R,k);
pushup(p);
}
int query(int l,int r,int p,int L,int R){
if(L<=l&&r<=R)return c[p].s;
int mid=(l+r)>>1,res=0;pushdown(l,r,p);
if(L<=mid)res=(res+query(lson,L,R))%P;
if(R>mid)res=(res+query(rson,L,R))%P;
return res;
}
void addPath(int u,int v,int k){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
update(1,n,1,dfn[top[u]],dfn[u],k);
u=pa[top[u]];
}
if(dep[u]<dep[v])swap(u,v);
update(1,n,1,dfn[v],dfn[u],k);
}
int askPath(int u,int v){
int res=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
res=(res+query(1,n,1,dfn[top[u]],dfn[u]))%P;
u=pa[top[u]];
}
if(dep[u]<dep[v])swap(u,v);
res=(res+query(1,n,1,dfn[v],dfn[u]))%P;
return res;
}
void addTree(int u,int k){
update(1,n,1,dfn[u],dfn[u]+siz[u]-1,k);
}
int askTree(int u){
return query(1,n,1,dfn[u],dfn[u]+siz[u]-1);
}
#undef ls
#undef rs
#undef lson
#undef rson
}Tr;
signed main(){
n=read(),m=read(),root=read(),P=read();
for(int i=1;i<=n;i++)a[i]=read()%P;
for(int i=1,u,v;i<n;i++)u=read(),v=read(),add(u,v),add(v,u);
dfs1(root,0);dfs2(root,root);Tr.build(1,n,1);
while(m--){
int op=read(),x,y,z;
if(op==1){
x=read(),y=read(),z=read()%P;
Tr.addPath(x,y,z);
}
if(op==2){
x=read(),y=read();
printf("%lld\n",Tr.askPath(x,y));
}
if(op==3){
x=read(),z=read()%P;
Tr.addTree(x,z);
}
if(op==4){
x=read();
printf("%lld\n",Tr.askTree(x));
}
}
return 0;
}
欧拉函数
点击查看代码
int euler(int n){
int res=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
res=res/i*(i-1);
while(n%i==0)n/=i;
}
}
if(n>1)res=res/n*(n-1);
return res;
}
phi[1]=1;
for(int i=2;i<=n;i++){
if(!np[i])p[++tot]=i,phi[i]=i-1;
for(int j=1;j<=tot&&i*p[j]<=n;j++){
np[i*p[j]]=1;
if(i%p[j]==0){phi[i*p[j]]=phi[i]*p[j];break;}
else phi[i*p[j]]=phi[i]*phi[p[j]];
}
}
平衡树(线段树实现)
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int SIZ=1e7;
inline int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
struct segtree{
#define ls c[p].lc
#define rs c[p].rc
#define lson l,mid,ls
#define rson mid+1,r,rs
struct Node{
int lc,rc,c;
}c[400005];
int T=1;
void pushup(int p){
c[p].c=c[ls].c+c[rs].c;
}
int update(int l,int r,int p,int x,int k){
if(!p)p=++T;
if(l==r){c[p].c+=k;return p;}
int mid=(l+r)>>1;
if(x<=mid)ls=update(lson,x,k);
else rs=update(rson,x,k);
pushup(p);return p;
}
int query(int l,int r,int p,int L,int R){
if(!p)return 0;
if(L<=l&&r<=R)return c[p].c;
int mid=(l+r)>>1,res=0;
if(L<=mid)res+=query(lson,L,R);
if(R>mid)res+=query(rson,L,R);
return res;
}
int find(int l,int r,int p,int k){
if(!p)return 0;
if(l==r)return l;
int mid=(l+r)>>1;
if(k<=c[ls].c)return find(lson,k);
else return find(rson,k-c[ls].c);
}
void insert(int x){
update(-SIZ,SIZ,1,x,1);
}
void erase(int x){
update(-SIZ,SIZ,1,x,-1);
}
int rank(int x){
return query(-SIZ,SIZ,1,-SIZ,x-1)+1;
}
int val(int x){
return find(-SIZ,SIZ,1,x);
}
int pre(int x){
return find(-SIZ,SIZ,1,query(-SIZ,SIZ,1,-SIZ,x-1));
}
int suf(int x){
return find(-SIZ,SIZ,1,query(-SIZ,SIZ,1,-SIZ,x)+1);
}
#undef ls
#undef rs
#undef lson
#undef rson
}Tr;
signed main(){
int n=read();
while(n--){
int op=read(),x=read();
if(op==1)Tr.insert(x);
if(op==2)Tr.erase(x);
if(op==3)printf("%lld\n",Tr.rank(x));
if(op==4)printf("%lld\n",Tr.val(x));
if(op==5)printf("%lld\n",Tr.pre(x));
if(op==6)printf("%lld\n",Tr.suf(x));
}
return 0;
}
CRT/exCRT
点击查看代码
//CRT
int n=read(),m=1,ans=0;
for(int i=1;i<=n;i++){
a[i]=read(),b[i]=read(),m*=a[i];
}
for(int i=1,x,y;i<=n;i++){
exgcd(m/a[i],a[i],x,y);x=(x%a[i]+a[i])%a[i];
ans=(ans+(m/a[i])%m*b[i]%m*x%m)%m;
}
//exCRT
int mul(int a,int b,int m){
int res=0;
while(b){
if(b&1)res=(res+a)%m;
a=(a+a)%m,b>>=1;
}
return res;
}
int gcd(int a,int b){
return (b==0)?a:gcd(b,a%b);
}
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
int exgcd(int a,int b,int &x,int &y){
if(b==0){x=1,y=0;return a;}
int g=exgcd(b,a%b,x,y),z=x;x=y;y=z-a/b*y;return g;
}
int n,a[100005],b[100005];
signed main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read(),b[i]=read();
}
int m=a[1],ans=b[1],fl=1;
for(int i=2,x,y,g,c;i<=n;i++){
g=exgcd(m,a[i],x,y),x=(x%a[i]+a[i])%a[i];
if((((b[i]-ans)%a[i]+a[i])%a[i])%g){fl=0;break;}
c=((b[i]-ans)%a[i]+a[i])%a[i]/g;
x=mul(x,c,a[i]),ans=(ans+mul(m,x,lcm(m,a[i]))),m=lcm(m,a[i]),ans=(ans%m+m)%m;
}
printf("%lld\n",fl?ans%m:-1);
}
Lucas/exLucas
点击查看代码
//Lucas
int qpow(int b,int p,int mod){
int res=1;b%=mod;
while(p){
if(p&1)res=res*b%mod;
p>>=1,b=b*b%mod;
}
return res;
}
int jc[100005];
int C(int n,int m,int p){
if(n<0||m<0||n-m<0)return 0;
return jc[n]*qpow(jc[m],p-2,p)%p*qpow(jc[n-m],p-2,p)%p;
}
int Lucas(int n,int m,int p){
if(n==0)return 1;
return Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
//exLucas
BSGS/exBSGS
点击查看代码
//BSGS
int qpow(int b,int p,int mod){
int res=1;
while(p){
if(p&1)res=res*b%mod;
b=b*b%mod;p>>=1;
}
return res;
}
map<int,int>h;
int BSGS(int p,int b,int n){
int t=sqrt(p)+1;n%=p;for(int i=0;i<t;i++)h[n*qpow(b,i,p)%p]=i;
b=qpow(b,t,p);if(!b)return (n==0)?1:-1;
for(int i=1,val,j;i<=t;i++){
val=qpow(b,i,p),j=(h.find(val)==h.end())?-1:h[val];
if(j>=0&&i*t-j>=0)return i*t-j;
}
return -1;
}
signed main(){
int p=read(),b=read(),n=read(),ans=BSGS(p,b,n);
if(ans==-1)puts("no solution");
else printf("%lld",ans);
return 0;
}
//exBSGS
压位高精
点击查看代码
struct Bignum{
static const long long N=75;
static const long long base=1e17;
static const long long ws=17;
long long s[N];
Bignum(){memset(s,0,sizeof s);s[0]=1;}
void print(){
printf("%lld",s[s[0]]);
for(long long i=s[0]-1;i;--i)printf("%0*lld",(int)ws,s[i]);
puts("");
}
Bignum & fix(){
for(long long i=1;i<=s[0];++i){
if(s[i]<0)s[i+1]--,s[i]+=base;
s[i+1]+=s[i]/base,s[i]%=base;
if(s[i+1])s[0]=max(s[0],i+1ll);
}
while(s[0]>1&&s[s[0]]==0)s[0]--;
return *this;
}
Bignum & operator = (string &b){
long long len=b.length();
long long x=0,t=1,p=0;
for(long long i=len-1;i>=0;--i){
x=t*(b[i]-'0')+x,t*=10,p++;
if(p==ws)s[s[0]++]=x,x=0,p=0,t=1;
}
if(x)s[s[0]]=x;
return fix();
}
bool operator < (const Bignum b) const{
if(s[0]!=b.s[0])return s[0]<b.s[0];
for(long long i=s[0];i>=1;--i)if(s[i]!=b.s[i])return s[i]<b.s[i];
return false;
}
bool operator <= (const Bignum b) const{
if(s[0]!=b.s[0])return s[0]<b.s[0];
for(long long i=s[0];i>=1;--i)if(s[i]!=b.s[i])return s[i]<b.s[i];
return true;
}
bool operator > (const Bignum b) const{return b<*this;}
bool operator >= (const Bignum b) const{return b<=*this;}
bool operator == (const Bignum b) const{return !(*this<b)&&!(*this>b);}
bool operator != (const Bignum b) const{return !(*this==b);}
Bignum operator + (const Bignum b) const{
Bignum c;c.s[0]=max(s[0],b.s[0]);
for(long long i=1;i<=c.s[0];++i)c.s[i]=s[i]+b.s[i];
return c.fix();
}
Bignum operator + (const long long & b) const{
Bignum c=*this;c.s[1]+=b;
return c.fix();
}
Bignum operator - (const Bignum b) const{
Bignum c;c.s[0]=max(s[0],b.s[0]);
for(long long i=1;i<=c.s[0];++i)c.s[i]=s[i]-b.s[i];
return c.fix();
}
Bignum operator * (const Bignum b) const{
Bignum c;c.s[0]=s[0]+b.s[0]-1;
for(long long i=1;i<=s[0];++i)for(long long j=1;j<=b.s[0];j++)c.s[i+j-1] += s[i]*b.s[j];
return c.fix();
}
Bignum operator * (const long long & b) const{
Bignum c=*this;
for(long long i=1;i<=s[0];++i)c.s[i]*=b;
return c.fix();
}
Bignum operator / (const Bignum b) const{
Bignum c,rest;
for(long long i=s[0];i>=1;--i){
rest=rest*(long long)base+s[i];
long long l=0,r=base,ans=0;
while(l<=r){
long long mid=(l+r)/2;
if(rest>=b*mid)ans=mid,l=mid+1;
else r=mid-1;
}
c.s[i]+=ans,rest=rest-b*ans;
}
return c.fix();
}
Bignum operator % (const Bignum b) const{
Bignum rest=*this-(*this)/b*b;
return rest.fix();
}
};
差分约束
点击查看代码
int n,m,vis[5005],dis[5005],in[5005];
int spfa(int x){
for(int i=1;i<=n;i++)dis[i]=inf,vis[i]=in[i]=0;
dis[x]=0,vis[x]=1;queue<int>q;q.push(x);
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w,in[v]=in[u]+1;
if(in[v]>n)return 1;
if(!vis[v])q.push(v),vis[v]=1;
}
}
}
return 0;
}
signed main(){
n=read(),m=read();
for(int i=1,u,v,w;i<=m;i++)u=read(),v=read(),w=read(),add(v,u,w);
for(int i=1;i<=n;i++)add(0,i,0);
if(spfa(0))return puts("NO"),0;
for(int i=1;i<=n;i++)printf("%lld ",dis[i]);
return 0;
}
modint
点击查看代码
template<const int T>
struct ModInt{
const static int mod=T;
int x;
ModInt(int x=0):x(x%mod){}
int val(){return x;}
ModInt operator +(const ModInt &a)const{int x0=x+a.x;return ModInt(x0<mod?x0:x0-mod);}
ModInt operator -(const ModInt &a)const{int x0=x-a.x;return ModInt(x0<0?x0+mod:x0);}
ModInt operator *(const ModInt &a)const{return ModInt(x*a.x%mod);}
ModInt operator /(const ModInt &a)const{return *this*a.inv();}
void operator +=(const ModInt &a){x+=a.x;if(x>=mod)x-=mod;}
void operator -=(const ModInt &a){x-=a.x;if(x<0)x+=mod;}
void operator *=(const ModInt &a){x=x*a.x%mod;}
void operator /=(const ModInt &a){*this=*this/a;}
friend ModInt operator +(int y,const ModInt &a){int x0=y+a.x;return ModInt(x0<mod?x0:x0-mod);}
friend ModInt operator -(int y,const ModInt &a){int x0=y-a.x;return ModInt(x0<0?x0+mod:x0);}
friend ModInt operator *(int y,const ModInt &a){return ModInt(y*a.x%mod);}
friend ModInt operator /(int y,const ModInt &a){return ModInt(y)/a;}
friend ostream &operator<<(ostream &os,const ModInt &a){return os<<a.x;}
friend istream &operator>>(istream &is,ModInt &t){return is>>t.x;}
ModInt pow(int p)const{
ModInt res=1,b=x;
for(;p;p>>=1,b*=b)if(p&1)res*=b;
return res;
}
ModInt inv()const{
int a=x,b=mod,u=1,v=0;
while(b){
int t=a/b;
a-=t*b;swap(a,b);
u-=t*v;swap(u,v);
}
if(u<0)u+=mod;
return u;
}
};
typedef ModInt<mod>mint;
伪万能头
点击查看代码
#include<algorithm>
#include<bitset>
#include<cctype>
#include<cerrno>
#include<clocale>
#include<cmath>
#include<complex>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<limits>
#include<list>
#include<map>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<string>
#include<utility>
#include<vector>
#include<cwchar>
#include<cwctype>